繁体   English   中英

Java引发错误并捕获NullPointerException

[英]Java throwing Error and catching NullPointerException

这对我来说毫无意义。

第一个例子:

示例1(良好):

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

使用此代码,一切都很好-引发并捕获了异常。

示例2(坏):

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

这不会编译,因为catch块无法捕获Exception子类NullPointerException 它不知道会抛出哪种异常。

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

因此,让我们将异常更改为NullPointerException

示例3(良好)

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

简单和逻辑,但是这里确实有些奇怪:

示例4(好的)-不知道为什么?:

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

如果抛出Error ,如何捕获NullPointerException 这个不成立。

有:

可抛出:错误,异常

ErrorException都是Throwable子类,但是NullPoinTerExceptionError没有关系,它是Exception而不是Error

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

您应该使用throw new Exception ();

只是为了澄清。 如果您要问为什么第二个示例不能编译,而第四个示例可以编译:

错误及其子类是未经检查的异常,无需在throws子句中捕获或声明。

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

JLS 11.1.1。

这就是为什么您可以引发Error并捕获Exception ,并且代码将进行编译的原因。

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

有两件事要注意。

首先,抛出NullPointerException ,因为您正在抛出一个null对象。 这与您尝试引发的异常的声明类型无关。

其次,由于Error子类是未经检查的异常 ,因此编译器不会抱怨缺少Error的catch块。 您的第二个示例未编译,因为并非所有Exception子类都是未经检查的异常。 因此,当编译器遇到throw e声明,其中声明的类型eException ,它需要一个catch块Exception

暂无
暂无

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

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