繁体   English   中英

已检查和未检查的自定义异常

[英]Checked and Unchecked Custom Exception

我感到困惑的行为CustomExceptions下面program.If Line2的评论和Line1不是那么程序运作良好,但如果Line1的评论和Line2不那么编译时错误当属“为CustomChecked.This例外无法到达的catch块不会从Line3的try语句主体中抛出”。请帮助我为什么此comple time异常仅用于unChecked Exception ?。

       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);
    }   
}

CustomUnChecked是一个RuntimeException ,它unchecked意味着编译器不检查谁可以/可以throwexception 编译器假定每个对象/方法/代码块都可以throw任何类型的RuntimeException ,因此您始终可以在check语句中检查这种类型的异常。

另一方面,对CustomChecked进行了检查,这意味着编译器会检查所有可能引发该错误的方法和代码块。 因此,只有在知道(在编译时)知道调用了将异常抛出到try块内的方法/代码时,您才能catch已检查的异常。

综上所述-编译器会通知您,不需要(第3行中的) catch ,因此应该删除它,因为没有人会在try语句内throw CustomCheckedException 由于compilerchecked CustomUnCheckedException (它是运行时,假定会意外抛出),因此可以保留它的check语句。

Java Spec中适用的部分是11.2.3 它读

如果catch子句可以捕获经过检查的异常类E1,则是编译时错误,并且与catch子句相对应的try块不能抛出作为E1的子类或超类的经过检查的异常类,除非E1是Exception或Exception的超类。

注意,此子句仅限于“检查”异常。 根据“未检查”的定义,未检查的异常不会应用这些检查。 因此,您看到的行为有所不同。

编译器不会检查您是否捕获了RuntimeException,但会检查您是否捕获了异常。 这就是为什么如果尝试捕获不存在的已检查异常(如果该异常不在throws子句中,则它不应该存在,因为它是一个已检查的异常)而导致错误,并且如果您捕获了RuntimeException(可能发生,则不会出错)即使您没有将它放在throws子句中,例如NullPointerException)。

简而言之,CheckedExceptions必须在throws子句中声明,并且必须被捕获。 可以捕获未经检查的异常,但是编译器无法知道if代码是否抛出未经检查的异常,因此,无论是否进行检查,它都不会给您带来错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM