Java catch块使用静态绑定?

Mar*_*ton 2 java instanceof

假设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:每个捕捞,它们的静态类型InvalidResourceExceptionResourceException分别.在最后一个示例中,您有一个名为的变量e,其静态类型为Exception.如果您添加了新变量并使用强制转换分配给它们,那么您将获得与try/catch相同的行为(尽管您必须丢失最后的其他分支).