2014-10-27 90 views
1

这是对我来说没有意义的东西。Java抛出错误和捕获NullPointerException

第一个例子:

实施例1(GOOD):

public static void main(String args[]){ 
     try { 
      Exception e = null; 
      throw e; 
     } catch (Exception e) { 
     } 

一切都很好与部份代码 - 抛出异常,并且捕获。

实施例2(BAD):

public static void main(String args[]){ 
    try { 
     Exception e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 
} 

这不会编译,因为catch块不能赶上NullPointerException这是Exception子类。它不知道会抛出什么样的异常。

java.lang.Object 
    java.lang.Throwable 
     java.lang.Exception --> Thrown 
      java.lang.RuntimeException 
       java.lang.NullPointerException --> Cannot catch like this 

因此,让我们改变例外NullPointerException

例3(GOOD)

public static void main(String args[]) { 
    try { 
     NullPointerException e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 

简单而合乎逻辑的,但在这里谈到的东西很奇怪:

例4(GOOD) - 不知道为什么?:

public static void main(String args[]) { 
    try { 
     Error e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 

如果我扔Error,我怎么能抓到NullPointerException?这个不成立。

有:

的Throwable:错误,异常

两个ErrorExceptionThrowable子类,但NullPoinTerException无关,与Error,这是一个Exception,不Error

+2

这些例子都不是很好。你从哪里弄到的? – duffymo 2014-10-27 09:26:28

+0

你确定'catch(NullPointerException e)'*捕获了'错误'吗? – 2014-10-27 09:26:50

+0

是的,这是我的问题的整个观点:) – RichardK 2014-10-27 09:27:48

回答

8

您正试图抛出一个空对象,该对象失败,并导致抛出NullPointerException

您应该抛出一个异常与throw new Exception();

只是为了澄清。如果你问为什么你的第二个例子没有编译,而第四个例子是这样的:

错误和它的子类是未经检查的例外,它不必在throws子句中被捕获或声明。

未检查异常类是运行时异常类和错误类

JLS 11.1.1.

这就是为什么你可以抛出一个Error,赶上一个Exception,并且代码进行编译。

另一方面,在第二个示例中,您试图抛出检查异常(Exception)并捕获NullPointerException,它不是超级类别Exception。这就是为什么代码不会编译,除非你捕获Exception或声明你的主要方法throws Exception

+1

是的,我知道,但请检查最后一个例子。 – RichardK 2014-10-27 09:28:44

+0

问题是*'throw'命令本身*抛出异常,因为你试图抛出null。 – chrylis 2014-10-27 09:29:31

+1

所以没关系,我抛出错误而不是异常,抛出异常? – RichardK 2014-10-27 09:30:55

1

有两点需要注意。

首先,因抛掷null对象而抛出NullPointerException对象。这与您试图抛出的异常的声明类型无关。

其次,由于Error子类是unchecked异常,编译器不抱怨说Error catch块丢失。你的第二个例子没有编译,因为Exception的所有子类都不是未检查的异常。因此,当编译器遇到throw e声明,其中e的声明类型为Exception时,它需要一个catch块以用于Exception

相关问题