* Изключения дефинирани от потребителя
Публикувано на 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 методите се използват след като обекта е вече създаден.