假设InvalidResourceException是ResourceException的子类.定义两种方法:
void handleException(ResourceException e) {
System.out.println("ResourceException " + e.toString());
}
void handleException(InvalidResourceException e) {
System.out.println("InvalidResourceException " + e.toString());
}
Run Code Online (Sandbox Code Playgroud)
现在以下代码:
try {
throw new InvalidResourceException("invalid resource");
} catch (ResourceException e) {
handleException(e);
}
Run Code Online (Sandbox Code Playgroud)
打印这个:
ResourceException: com.myPackage.InvalidResourceException: invalid resource
Run Code Online (Sandbox Code Playgroud)
但是以下代码:
try {
throw new InvalidResourceException("invalid resource");
} catch (InvalidResourceException e) {
handleException(e);
} catch (ResourceException e) {
handleException(e);
}
Run Code Online (Sandbox Code Playgroud)
打印这个:
InvalidResourceException: com.myPackage.InvalidResourceException: invalid resource
Run Code Online (Sandbox Code Playgroud)
这是Sun的JDK 1.5.0_15.
这与Java标准一致吗?
这段代码应该怎么做?
Exception e = new InvalidResourceException("invalid resource");
handleException(e);
Run Code Online (Sandbox Code Playgroud)
这段代码应该怎么做?
Exception e = new InvalidResourceException("invalid resource");
if (e instanceOf ResourceException) {
handleException(e);
} else if (e instanceOf InvalidResourceException) {
handleException(e);
} else {
handleException(e):
}
Run Code Online (Sandbox Code Playgroud)
Lau*_*ves 11
是.这是正确的.过载总是静态解决.
后两个示例都不会编译为e静态类型Exception,并且您的重载都不接受该类型.
编辑:
请注意,您的最后一个示例实际上并不是try/catch块的直接模拟.在try/catch语句有两个变量,叫作e:每个捕捞,它们的静态类型InvalidResourceException和ResourceException分别.在最后一个示例中,您有一个名为的变量e,其静态类型为Exception.如果您添加了新变量并使用强制转换分配给它们,那么您将获得与try/catch相同的行为(尽管您必须丢失最后的其他分支).