C, PHP, VB, .NET

Дневникът на Филип Петров


* Изключения дефинирани от потребителя

Публикувано на 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()" без проблем. Виждате, че дефинирането на изключения е изключително лесно. Това е и мощен метод за контрол над интегритета на данните в клас.

 



2 коментара


  1. 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 методи?

  2. Това е конструктор - той се извиква само веднъж при създаването на обекта. Get и Set методите се използват след като обекта е вече създаден.

Добави коментар

Адресът на електронната поща няма да се публикува


*