已选中和未选中自定义例外

时间:2014-09-03 10:34:56

标签: java exception exception-handling

我对以下程序中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);
    }   
}

3 个答案:

答案 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代码是否会引发未经检查的异常,因此如果您检查它,它将不会给您一个错误。

相关问题