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)<br>
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());我们写它时,我不明白代码是如何工作的。
这些例子有效。
异常必须被捕获,否则它会被抛出更高的控制代码级别。
函数也是如此
main在第一个例子中,你把它扔到外面
从而表明您不想处理此异常并将此责任放在运行该函数的人身上
main。弹出的结果是程序终止并输出此异常;纯粹从技术上讲,此机制的工作方式与程序内部相同。操作系统会意识到异常并可以采取措施处理它。
想象一下,您的遛狗计划是更大项目的一部分。控制代码还应该了解异常情况并能够重新启动程序等。
PS:
getMessage这是异常字段的访问器方法message,它显示传递给异常构造函数并存储在变量中的字符串message