为什么异常类型会影响什么,并且不会编译?

时间:2011-12-23 15:39:50

标签: java exception-handling

我有两个版本的代码。在Method() - 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)

5 个答案:

答案 0 :(得分:6)

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

但是,偶然Exception 未选中,而您执行需要在throws声明中声明。您需要在第二个代码段中Method()抛出Exception

未经核实的例外有RuntimeExceptionError和衍生类。 NullPointerException衍生自RuntimeException

答案 1 :(得分:2)

NullPointerExceptionRunTimeException(或未经检查),无需在编译时处理。但是,Exception被视为已检查的异常,必须由遇到它的任何方法捕获或抛出。

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

static void Method() throws Exception

Unchecked Exceptions - The Controversy

答案 2 :(得分:2)

由于您的方法“Method()”抛出Exception,您必须在方法签名上声明它:

static void Method() throws Exception

它会编译。 干杯!

答案 3 :(得分:1)

试试这个作为第二个例子:

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

这应该编译好,

答案 4 :(得分:1)

版本1的代码不能在java版本6或更低版本中编译,我猜你使用的是java 7.

Java 7着眼于编译时,确实会抛出异常类型。在案例1中,它是一个运行时异常,它不会出现在方法的签名中。