public class AnimalException extends Exception {
public AnimalException(String error) {
super(error);
}
}
public class Zoo {
private String animal;
private String food;
public Zoo (String animal, String food) throws AnimalException {
this.animal = animal;
if (findWord(animal, "wolf")) {
throw new AnimalException("This animal is a predator.");
//something ought to be done here, I reckon
}
else {
this.food = food;
}
}
public static boolean findWord(String word, String find) {
int total = 0;
int idx = 0;
while ( (idx = word.indexOf(find, idx))!= -1 ) {
total++;
idx++;
}
if (total == 0) {
return false;
}
else {
return true;
}
}
我想要做的是当构造函数中捕获wolf
时,food
的值会自动更改为其他内容。我确实尝试使用getter-setters
,但是我收到unreachable code
的错误。
我该怎么办?
答案 0 :(得分:2)
如果您想要在检测到狼的情况下执行某些特定逻辑,则异常不是正确的方法。如果实例的构造在找到" wolf"时失败,则应该抛出异常。
public Zoo (String animal, String food) {
this.animal = animal;
if (findWord(animal, "wolf")) {
// put whatever logic you wish here
}
else {
this.food = food;
}
}
答案 1 :(得分:1)
你的设计问题是,caling throw exception
离开了块的范围,并且正在查找可以处理异常的try-catch
块。在你的情况下
void foo() {
if (somethingbad()) {
throw new exception();
bar(); // <-- unreachable code, since throw leaves foo function.
}
}
如果在构造函数中抛出异常并且异常离开了函数,因为构造函数中的异常没有try-catch
,则该对象的构造失败。因此,如果您的Zoo
禁止将狼作为动物,则应该抛出异常(因此永远不会创建Zoo
)。
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");
}
}
另外,您是否知道,您的Zoo
可能只包含一种动物和一种食物?
还有一件事。您的方法findWord(String, String)
太复杂了。 Java包含许多有用的类和函数,因此我们不会一次又一次地拖延自己编写代码。寻找一个单词的子串是非常有用和最喜欢的功能。看看indexOf(String)
。它专为您的purpouse而设计,可能也是类似的。
答案 2 :(得分:0)
也许您需要在抛出异常之前设置食物值,在if语句中设置,而不是在之后?像这样:
public Object (String animal) throws AnimalException {
this.animal = animal;
if (findWord(animal, "wolf")) {
this.food = food;
throw new AnimalException("This animal is a predator.");
//something ought to be done here, I reckon
}
else {
this.food = food;
}
}