繁体   English   中英

为什么异常类型会影响编译的内容,而不会影响编译的内容呢?

[英]Why does exception type affect what will, and won't, compile?

我有两个版本的代码。 在第一个版本类型的异常中的哪一个在方法()倒掉- NullPointerException ,在第二版本- Exception 但是,第一个版本可以编译,而第二个版本则不能编译。 为什么会这样呢?

public class Demo
{
    static void Method()
    {
        try
        {
            throw new NullPointerException("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

这是第二个版本。

public class Demo
{
    static void Method()
    {
        try
        {
            throw new Exception("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

第一个版本的堆栈跟踪:

java.lang.NullPointerException: error
    at Demo.Method(Demo.java:7)
    at Demo.main(Demo.java:18)

这是因为NullPointerException是所谓的“未经检查的”异常。 您无需在throws子句中声明它们。

但是,偶然的Exception 不会未被选中,并且您确实需要在throws声明中进行声明。 您需要在第二个代码片段中使Method()抛出Exception

未经检查的异常是RuntimeExceptionError和派生类。 NullPointerException派生自RuntimeException

NullPointerExceptionRunTimeException (或未经检查),不必在编译时进行处理。 但是, Exception被视为检查异常,并且必须由遇到该异常的任何方法捕获或抛出。

可以通过如下更改方法声明来修复第二个片段:

static void Method() throws Exception

未经检查的例外-争议

由于您的方法“ Method()”抛出Exception ,因此您必须在方法签名上对其进行声明:

static void Method() throws Exception

它将编译。 干杯!

尝试作为第二个示例:

public class Demo
{
    static void Method() throws Exception
    {
        try
        {
            throw new Exception("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

这样应该可以编译,

版本1的代码无法在Java版本6或更低版本中编译,我想您正在使用Java 7。

Java 7会在编译时抛出确切的异常类型。 在情况1中,它是运行时异常,没有在方法的签名中显示。

暂无
暂无

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

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