你的设计问题是,caling throw异常离开了块的范围,并且正在寻找可以处理异常的try-catch块.在你的情况下
void foo() {
if (somethingbad()) {
throw new exception();
bar(); //
}
}
如果在构造函数中抛出异常并且异常离开了函数,因为构造函数中没有针对该异常的try-catch,该对象的构造将失败.因此,如果您的动物园禁止将狼作为动物,您应该抛出异常(因此动物园永远不会被创造).
public Zoo (String animal, String food) throws AnimalException {
this.animal = animal;
if (findWord(animal, "wolf")) {
throw new AnimalException("This animal is a predator.");
}
else {
this.food = food;
}
}
void foo() {
Zoo myZoo;
try {
myZoo = new Zoo("wolf", "meat");
} catch (AnimalException ex) {
System.out.println(ex.toString())
}
// myZoo is still null, uninitialized.
}
但是,如果您想在Zoo中拥有捕食者,但向所有访问者发出警告,则应该只显示一些警告.
public Zoo (String animal, String food) throws AnimalException {
this.animal = animal;
this.food = food;
if (findWord(animal, "wolf")) {
System.out.println("Beware, we have a predator in zoo");
}
}
另外,您知道吗,您的动物园可能只包含一种动物和一种食物吗?
还有一件事.你的方法findWord(String,String)太复杂了. Java包含许多有用的类和函数,因此我们不会一次又一次地拖延自己编写代码.寻找一个单词的子串是非常有用和最喜欢的功能.看看indexOf(String).它完全是为您的purpouse设计的,可能也是类似的.