#java #исключения
public class DogIsNotReadyException extends Exception { public DogIsNotReadyException(String message) { super(message); } } public class Dog { String name; boolean isCollarPutOn; boolean isLeashPutOn; boolean isMuzzlePutOn; public Dog(String name) { this.name = name; } public void putCollar() { System.out.println("Ошейник надет!"); this.isCollarPutOn = true; } public void putLeash() { System.out.println("Поводок надет!"); this.isLeashPutOn = true; } public void putMuzzle() { System.out.println("Намордник надет!"); this.isMuzzlePutOn = true; } public void walk() throws DogIsNotReadyException { System.out.println("Собираемся на прогулку!"); if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) { System.out.println("Ура, идем гулять! " + name + " очень рад!"); } else { throw new DogIsNotReadyException("Собака " + name + " не готова к прогулке! Проверьте экипировку!"); } } } public class Test { public static void main(String[] args) throws DogIsNotReadyException { Dog dog = new Dog("Rex"); dog.putCollar(); dog.putMuzzle(); dog.walk(); } } Почему вот этот код выводит в консоль: Ошейник надет! Намордник надет! Собираемся на прогулку! Exception in thread "main" DogIsNotReadyException: Собака Rex не готова к прогулке! Проверьте экипировку! at Dog.walk(Dog.java:35)
at Test.main(Test.java:6) А вот ниже пример, выводит вот это: Ошейник надет! Намордник надет! Собираемся на прогулку! Собака Мухтар не готова к прогулке! Проверьте экипировку! Проверяем снаряжение! Ошейник надет? true Поводок надет? false Намордник надет? true Вот пример: public class DogIsNotReadyException extends Exception { public DogIsNotReadyException(String message) { super(message); } } public class Dog { String name; boolean isCollarPutOn; boolean isLeashPutOn; boolean isMuzzlePutOn; public Dog(String name) { this.name = name; } public void putCollar() { System.out.println("Ошейник надет!"); this.isCollarPutOn = true; } public void putLeash() { System.out.println("Поводок надет!"); this.isLeashPutOn = true; } public void putMuzzle() { System.out.println("Намордник надет!"); this.isMuzzlePutOn = true; } public void walk() throws DogIsNotReadyException { System.out.println("Собираемся на прогулку!"); if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) { System.out.println("Ура, идем гулять! " + name + " очень рад!"); } else { throw new DogIsNotReadyException("Собака " + name + " не готова к прогулке! Проверьте экипировку!"); } } } public class Test { public static void main(String[] args) { Dog dog = new Dog("Rex"); dog.putCollar(); dog.putMuzzle(); try{ dog.walk(); } catch (DogIsNotReadyException e) { System.out.println(e.getMessage()); System.out.println("Проверяем снаряжение! \n Ошейник надет? " + dog.isCollarPutOn + "\r\n Поводок надет? " + dog.isLeashPutOn + "\r\n Намордник надет? " + dog.isMuzzlePutOn); } } } Вопросы: Почему первый пример не работает если мы метод main помечаем throws? Должно же одинаково отрабатывать как с первым примером так и со вторым. Ну либо throws либо try catch должно быть. Не понимаю как отрабатывает метод getMessage(), залез в исходники и увидел вот это: public String getMessage() { return detailMessage; } Посмотрел что такое detailMessage это просто переменная, не очень всё равно понял как это отрабатывает. Для проверки сделал вот так: public class Test { public static void main(String[] args) { Dog dog = new Dog("Rex"); try{ dog.walk(); } catch (DogIsNotReadyException e) { System.out.println(e.getMessage()); } } } Вывелось в консоль: Собираемся на прогулку! Собака Rex не готова к прогулке! Проверьте экипировку! В вызове метода walk отрабатывает System.out.println("Собираемся на прогулку!"); А вот потом отрабатывает throw new DogIsNotReadyException("Собака " + name + " не готова к прогулке! Проверьте экипировку!"); но только когда System.out.println(e.getMessage()); мы написали, не понимаю как отрабатывает код.
Ответы
Ответ 1
Примеры работают. Исключение необходимо ловить, иначе оно выбрасывается выше, на уровень управляющего кода. Это справедливо и для функции main В первом примере вы его пробрасываете наружу public static void main(String[] args) throws DogIsNotReadyException { тем самым указывая что не хотите заботится об обработке этого исключения и возлагаете эту ответственность на того, кто запускает функцию main. результат выброса - завершение программы с выводом этого исключения, чисто технически это механизм отработает так же как и внутри программы. ОС узнает об исключении и может предпринять действия по его обработке. Представьте что Ваша программа по выгулу собак часть чего-то большего. Управляющий код так же должен узнать о нештатных ситуациях и уметь например перезапустить Вашу программу. PS: getMessage это метод акцессор для поля message у исключения, оно выводит строку, которая была передана в конструктор исключения и там запомнена в переменную message
Комментариев нет:
Отправить комментарий