Java 选中和未选中的自定义异常

Java 选中和未选中的自定义异常,java,exception,exception-handling,Java,Exception,Exception Handling,我对下面程序中的CustomExceptions的行为感到困惑。如果Line2被注释而Line1未被注释,则程序工作正常,但如果Line1被注释而Line2未被注释,则编译时错误出现第3行的“CustomChecked的不可访问catch块。从不从try语句体引发此异常”。请帮助我为什么此comple time异常仅适用于未检查的异常 try { if(true) { throw new

我对下面程序中的
CustomExceptions
的行为感到困惑。如果
Line2
被注释而
Line1
未被注释,则程序工作正常,但如果
Line1
被注释而
Line2
未被注释,则编译时错误出现第3行的“CustomChecked的不可访问catch块。从不从try语句体引发此异常”。请帮助我为什么此comple time异常仅适用于未检查的异常

       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
意思是编译器不会检查谁可以/做
throw
那个
exception
。编译器假设每个对象/方法/代码块都可以
throw
任何类型的
RuntimeException
在您的
check
语句中检查此类异常

另一方面,CustomChecked被选中,这意味着编译器会检查所有可以抛出异常的方法和代码块。因此,如果知道(在编译时)调用了在
try
块中抛出异常的方法/代码,则只能
捕获选中的异常


总之,编译器会通知您,第3行中的
catch
是不需要的(因此应该删除),因为不可能有人在try语句中
抛出
CustomCheckedException。因为
编译器
检查
CustomUnCheckedException(它是运行时,假设被抛出),检查它的
语句可以保留。

这里适用的Java规范部分是

如果catch子句可以捕获选中的异常类E1,并且与catch子句对应的try块不会抛出作为E1的子类或超类的选中异常类,则这是编译时错误,除非E1是exception或exception的超类


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

编译器不会检查您是否捕获RuntimeException,但会检查您是否捕获异常。这就是为什么如果您试图捕获一个不存在的已检查异常(如果它不在throws子句中,则它不应该存在,因为它是一个已检查的异常),则为错误;如果您捕获一个RuntimeException,则为无错误(即使您没有将其放入throws子句中,例如NullPointerException,也可能发生这种情况)

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

感谢您的回复和回答。