use*_*687 1 java exception instanceof inherited
请注意:来电者只会抛出parentexception !!
说aexception,并bexception继承自parentexception.
在方法af,它throws aexception,bexception和parentexception.
void af() throws aexception, bexception, parentexception {}
Run Code Online (Sandbox Code Playgroud)
该方法caller调用af和throw parentexception只.
void caller() throws parentexception
Run Code Online (Sandbox Code Playgroud)
在这里,我们丢失了parentexception子类的信息.
该方法rootCaller调用该方法caller,rootcaller并且只能catch parentexception抛出caller并使用以下异常进程catch块:
void rootCaller() {
try {
caller();
} catch(parentexception e) {
if(e instanceof aexception) {
......
} else if(e instanceof bexception) {
......
} else if(e instanceof parentexception) {
......
} else {
......
}
}
Run Code Online (Sandbox Code Playgroud)
如果子类太多,这是如此丑陋并且很容易忘记一些parentexception的子类.
反正有没有改进这样的代码?
目前的答案不能给我任何想法:
1,rootCaller不能使用multi-catch来简化进程,导致调用者只抛出parentexception.
2,因为调用者只抛出parentexception,所以没有任何其他异常检查af是否被改为后者抛出超过aexception和bexception,比如说cexception.
正如其他人在评论中建议的那样,您应该使用多个catch子句.
void rootCaller() {
try {
caller();
} catch (AException e) {
// ...
} catch (ParentException e) {
// ...
} catch (BException e) {
// ...
} catch (AnotherException e) {
// ...
} catch (Exception e) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
渔获量的顺序也很重要.将依次针对每个案例测试异常,并仅触发匹配的第一个案例.
因此,例如在上面的代码中使用AException和BException扩展ParentException,catch (BException e)永远不会catch (ParentException e)到达并首先执行块.
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |