我对以下程序中CustomExceptions
的行为感到困惑。如果Line2
被评论而Line1
不是,那么程序效果很好,但如果评论Line1
并且Line2
不是编译时错误来自" CustomChecked的无法访问的catch块。这个异常永远不会从try语句体中抛出"对于Line3。请帮助我为什么这个补充时间异常只出现在unChecked异常中?。
try
{
if(true)
{
throw new CustomChecked("Checked Exception");// Line1
// throw new CustomUnChecked("Un-Checked Exception");// Line2
}
}
catch(CustomChecked ex) //Line3
{
System.out.println(ex.getMessage());
}
catch(CustomUnChecked ex)
{
System.out.println(ex.getMessage());
}
例外:
class CustomChecked extends Exception
{
public CustomChecked(String msg) {
super(msg);
}
}
class CustomUnChecked extends RuntimeException
{
public CustomUnChecked(String msg) {
super(msg);
}
}
答案 0 :(得分:1)
CustomUnChecked 是RuntimeException
unchecked
,这意味着编译器无法检查throw
exception
谁可以/ throw
。编译器假定每个对象/方法/代码块都可以RuntimeException
任何类型的check
,因此您始终可以在catch
语句中检查此类异常。
另一方面,选中 CustomChecked ,这意味着编译器会检查可以抛出它的所有方法和代码块。因此,如果您知道(在编译时)您调用在try
块内引发异常的方法/代码,则只能catch
已检查的异常。
总而言之 - 你的编译器通知你,你不需要第3行中的throw
(因此应该删除),因为没有人会checked
<在try语句中强> CustomCheckedException 。由于{strong> CustomUnCheckedException 不是compiler
check
(它是运行时,假设被抛出意外),它的{{1}}语句可以保留。
答案 1 :(得分:1)
此处适用的Java规范部分是11.2.3。它读取
如果catch子句可以捕获已检查的异常类E1并且不是对应于catch子句的try块可以抛出作为E1的子类或超类的已检查异常类,则是编译时错误,除非E1是Exception或Exception的超类。
请注意,此条款仅限于“已检查”。例外。未经检查的例外情况,根据“未选中”的定义&#39;没有应用这些检查。因此,您所看到的行为存在差异。
答案 2 :(得分:0)
编译器不会检查您是否捕获RuntimeExceptions,但它会检查您是否捕获了异常。这就是为什么如果你试图捕获一个不存在的已检查异常(如果它不在throws子句中,它不应该存在,因为它是一个已检查的异常),并且如果你正在捕获RuntimeException(可能发生),则会出现错误即使你没有把它放在throws子句中,例如NullPointerException。
因此,简而言之,CheckedExceptions必须在throws子句中声明并且必须被捕获。 可以捕获未经检查的异常,但编译器无法知道if代码是否会引发未经检查的异常,因此如果您检查它,它将不会给您一个错误。