请考虑以下代码
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块无法访问.
据编译器所知,您可以在任何时候获得堆栈溢出异常、内存不足异常、算术异常或任意数量的其他 JVM 生成的异常。另一方面,它可以静态分析该try块并发现它MyException从未被抛出,因此它举起了手。它知道它永远不会被 JVM 抛出。
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |