我是否可以捕获java.lang.Exception而不是它的子类?
考虑一下这句话:
public class Tree {
public static Tree newInstance() throws NoWaterException, NoSoilException, NoSunshineException {
...
return new Tree();
}
}
当我想获得Tree的实例时,我可以这样做:
public Tree plantTree() throws TreePlantExcetpion {
try {
...
return Tree.newInstance();
} catch (NoWaterException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no water", e);
} catch (NoSoilException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no soil", e);
} catch (NoSunshineException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no sunshine", e);
}
}
但我也可以这样做:
public Tree plantTree() throws TreePlantExcetpion {
try {
...
return Tree.newInstance();
} catch (Exception e) {
throw new TreePlantExcetpion("Cannot plant a tree", e);
}
}
我更喜欢方法plantTree
()的第二个实现,因为它更短更清晰,在这个方法中我不关心Exception
的具体子类,我需要做什么是将它包装在一个新的TreePlantExcetpion
中并传递它。所有详细信息都不会丢失。我确信Tree.newInstance()方法不会抛出任何其他类型的异常(至少目前为止)。我可以这样做吗?
注意:NoWaterException
,NoSoilException
,NoSunshineException
不能是TreePlantExcetpion
的子类。它们不在同一个继承层次结构中。
关键是,如果所有捕获的异常的异常处理相同,我可以抓住他们的超类,即java.lang.Exception
吗?
答案 0 :(得分:2)
创建TreePlantException的NoWaterException
,NoSoilException
和NoSunshineException
子类,您可以跳过整个try / catch,因为TreePlantException
已被声明为抛出。