#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
Комментариев нет:
Отправить комментарий