* Изключения дефинирани от потребителя
Публикувано на 21 октомври 2009 в раздел ПИК3 Java.
Вече се запознахме подробно как се хвърлят изключения в Java. Веднага остава въпроса "можем ли ние сами да си дефинираме изключения". Отговорът е положителен.
Всичко, което трябва да направите при дефиниране на изключение е да създадете клас, който наследява клас Exception:
public class CarsExample{
public static void main(String args[]) throws Exception {
try{
Car c = new Car(-150, "BMW X5");
}
catch (SpeedException e){
System.out.println(e.toString());
}
}
}
class SpeedException extends Exception{
private int speed;
public SpeedException(int speed){
this.speed = speed;
}
public String toString(){
return "Speed of Car must not be negative: "+this.speed;
}
}
class Car{
private int speed;
private String model;
public Car(int speed, String model) throws SpeedException{
this.setSpeed(speed);
this.model = model;
}
public void showInfo(){
System.out.println("The car "+this.model+" has maxspeed of "+this.speed);
}
public int getSpeed(){
return this.speed;
}
public void setSpeed(int speed) throws SpeedException{
if (speed < 0) throw new SpeedException(speed);
else this.speed = speed;
}
public int compare(Car opponent){
if (this.speed < opponent.getSpeed()) return 1;
else{
if (this.speed > opponent.getSpeed()) return -1;
else return 0;
}
}
}
Виждате, че при изключенията няма абсолютно нищо страшно. Единственото, за което трябва да се погрижите е да предефинирате метод "toString()". Колкото до другите методи - printStackTrace() си съществува и го наследяваме директно от клас Exception. Проблем се явява метод "getMessage()", който ако не се предефинира, то ще върне резултат null. Затова обикновено предаваме и съобщение към супер класа:
class SpeedException extends Exception{
private int speed;
public SpeedException(int speed){
super("Speed of car must not be negative: "+speed);
this.speed = speed;
}
public SpeedException(int speed, String msg){
super(msg);
this.speed = speed;
}
public String toString(){
return "Speed of Car must not be negative: "+this.speed;
}
}
Вече можете да извиквате метод "getMessage()" без проблем. Виждате, че дефинирането на изключения е изключително лесно. Това е и мощен метод за контрол над интегритета на данните в клас.
B class Car редовете
public Car(int speed, String model) throws SpeedException{
if (speed < 0) throw new SpeedException(speed);
else{
this.speed = speed;
this.model = model;
}
}
не би ли трябвало да елиминират нуждата от get u set методи?
Това е конструктор - той се извиква само веднъж при създаването на обекта. Get и Set методите се използват след като обекта е вече създаден.