Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果main()方法中未处理NullPointerException,会发生什么情况?_Java_Exception Handling_Nullpointerexception - Fatal编程技术网

Java 如果main()方法中未处理NullPointerException,会发生什么情况?

Java 如果main()方法中未处理NullPointerException,会发生什么情况?,java,exception-handling,nullpointerexception,Java,Exception Handling,Nullpointerexception,在下面的示例代码段中,NullPointerException从check()方法隐式传播到main()方法后,未在main()方法中处理 class Simple { public static void main(String[] args) { check(26); } public static void check(int a) throws SQLException, IOException { if (a % 2 == 0)

在下面的示例代码段中,NullPointerException从check()方法隐式传播到main()方法后,未在main()方法中处理

class Simple {
    public static void main(String[] args) {
        check(26);
    }

    public static void check(int a) throws SQLException, IOException {
        if (a % 2 == 0) {
            throw new NullPointerException("it is divisible by 2"); //we are raising a Null pointer exception here
        } else if (a % 3 == 0) {
            throw new IOException("it is divisible by 3"); //we are raising a IO Exception here
        } else if (a % 5 == 0) {
            throw new SQLException("it is divisible by 5"); //we are raising a SQL Exception here
        }
    }
}

检查时发生编译错误(26)抛出SQL异常的代码行,IO异常是从
check(int a)
method显式传播到main()方法的选中异常。如果在main()方法中没有处理NullPointerException,那么它在哪里得到处理?

认为装满鳗鱼的气垫船是正确的,处理NPE通常是不好的做法。您可以处理它以及任何其他未检查的异常

try {
    // your code
    check(26);
} catch (NullPointerException e) {
    // do something
}
您可以在此处阅读未经检查的异常

运行时将抛出空指针异常,即使我们处理它,它也会传播 这个例外是关于数据的

正如我们已经知道的,空指针异常是隐式传播的,而不使用throws关键字到main方法

不一定。如果未处理,它将向上传播到调用树中的任何入口点。如果您通过
java
工具(或调用
main
的其他工具)运行代码,这将是
main
,但是如果您使用Swing或编写servlet等,它可能是一个不同的入口点(对于servlet,它肯定会)

但是,如果用主要方法来处理,是否有必要呢

这取决于你所说的“必要”是什么意思。如果你不这样做,并且你已经用
java
工具运行了你的代码,如果有未处理的NPE,你的程序将终止


通常的做法是不捕获NPE,因为您的代码永远不应该抛出NPE,因此如果抛出NPE,那么您要修复的是一个bug(通过找出抛出NPE的原因并修复它),而不是捕获NPE。

首先:请注意,在实际代码中,您不会抛出相关的异常。
所有这些错误案例都应该抛出
IllegalArgumentException

NullPointerException
是一种
RuntimeException
,不是专门为客户机捕获而设计的(就像许多JDK
RuntimeException
一样,例如
ArrayIndexOutOfBoundsException
算术异常
,…。
抛出时,通常意味着引发问题的实际代码。
但是我们应该抓住它吗?
事实上,这取决于必须处理的类/组件的观点

< P > 1)如果从抛出 Null PoExtExealOuts/CODE >的组件/类的角度来看,我们认为这是一个程序员应该纠正的编程错误,我们希望它被传播到类的客户端。 所以我们不想抓住它

2) 在其他情况下,我们知道
NullPointerException
是一个编程错误,但我们不希望它停止程序并传播给应用程序用户。因此,我们希望捕获
NullPointerException
以及可能导致异常程序终止的任何异常。

因此,我们将“风险”代码放在
catch(Exception)
语句中。

您的代码有几个问题,无法编译,因为:

  • 您正在从静态上下文(main)调用非静态方法(检查)

  • 您尚未在main方法中处理IOException、SQLException异常(抛出它们或用try-catch包围它们)

    这与NPE(空指针异常)无关,正如其他人所说,编译器允许空指针异常,因为它是未经检查的异常

    try {
        // your code
        check(26);
    } catch (NullPointerException e) {
        // do something
    }
    

  • 你从不“处理”NPE,而是调试你的代码来阻止它们——代码编译了吗?主方法不会抛出异常,也不会尝试/catch@HovercraftFullOfEels我无法编译代码,因为我在代码的check(26)步骤中看到编译错误。一旦您在该步骤中添加了try-catch,那么我就看不到任何编译错误了——代码是在您提到的更改之后编译的。1.将该方法设置为静态,以便可以在主方法2中访问它。向main方法添加了抛出,以便它传播到jvm@Aditya记住投票选出有用的答案,以鼓励社区成员提供更多帮助。是的,当然,谢谢你的投入。我也在这样做