选中未经检查的例外

jez*_*lan 7 java exception

请考虑以下代码

private int meth()
{
   try
   {
       return 1;
   }
   catch(Exception ex)
   {
       return 2;
   }
   finally
   {
       return 3;
   }
}
Run Code Online (Sandbox Code Playgroud)

编译上述代码时,"异常"被视为未经检查的异常.这是"无法访问的catch块异常永远不会在try块中抛出"编译错误不会发生.考虑我自己声明异常,

class MyException extends Exception
{
}
Run Code Online (Sandbox Code Playgroud)

并在代码中使用它

private int meth()
{
   try
   {
      return 1;
   }
   catch(MyException me)
   {
      return 2;
   }
   finally
   {
      return 3;
   }
}
Run Code Online (Sandbox Code Playgroud)

在这个"无法访问的catch块MyException永远不会在try块中抛出"编译错误发生.为什么在第一个场景中"异常"被视为RuntimeException,而在第二个场景中,即使"MyException"是"Exception"的子类,它也被视为已检查的异常.有人可以帮我解决这个问题吗?

Pet*_*ter 12

这种行为的原因是Java语言中唯一未经检查的异常是RuntimeException及其子类.所有其他异常和错误,包括您的,因为它只是子类Exception(而不是RuntimeException)是经过检查的异常.

第一个代码示例未被编译器标记的原因,尽管它使用Exception类作为其catch语句,这是因为类层次结构.由于所有异常都是从Exception派生的,因此您的代码并没有特别捕获Exception,而是捕获所有异常并将它们转换为Exception实例.因此,编译器无法判断将在运行时捕获的异常是已检查还是未检查的异常.在第二个代码块中,没有办法使捕获的异常不是一个已检查的异常,因此编译器可以确定您的catch块无法访问.


Joh*_*ica 3

据编译器所知,您可以在任何时候获得堆栈溢出异常、内存不足异常、算术异常或任意数量的其他 JVM 生成的异常。另一方面,它可以静态分析该try块并发现它MyException从未被抛出,因此它举起了手。它知道它永远不会被 JVM 抛出。