2011-12-23 59 views
0

我有两个版本的代码。在抛出方法()-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) 
+0

两个版本都一样吗? – viktor 2011-12-23 15:43:42

+0

@normalityity OP said“does not compil – CPerkins 2011-12-23 15:44:26

+0

他修正了它 - 之前两者都是一样的 – viktor 2011-12-23 15:47:08

回答

6

这是因为NullPointerException是一个所谓的 “选中” 的异常。您不需要在throws子句中声明它们。

然而,一个偶然Exception选中,你需要在throws声明中声明。您需要在第二个代码段中将Method()掷出Exception

未经检查的例外是RuntimeException,Error和派生类。 NullPointerException衍生自RuntimeException

2

NullPointerExceptionRunTimeException(或未检查)并且不必在编译时处理。然而,Exception被认为是一个检查过的异常,并且必须通过遇到它的任何方法捕获或抛出。

第二个片段可以通过改变方法声明确定如下:

static void Method() throws Exception 

Unchecked Exceptions - The Controversy

2

因为你的方法“方法()”抛出Exception,你必须声明它的方法签名:

static void Method() throws Exception 

它会编译。 干杯!

+0

我知道'throws'我对差异感兴趣 – eXXXXXXXXXXX2 2011-12-23 15:48:06

+0

对! upvoted fge的答案,这更好地解释你想要比我:) – jcxavier 2011-12-23 15:49:45

1

尝试将此作为第二个例子:

​​

这应该编译罚款,

1

版本1的代码不会在Java版本6或更低编译,我猜你使用的是Java 7

Java 7看着编译时巫婆确切的异常类型被抛出。在情况1中,它是运行时异常女巫不出现在该方法的签名中。

相关问题