JVM如何知道何时抛出NullPointerException

时间:2016-04-30 13:19:54

标签: java nullpointerexception compiler-construction jvm

Java虚拟机如何知道何时抛出NullPointerException?如果对象为null则检查是否必须抛出NullPointerException,它是否在我调用对象的每个方法之前检查?如果是这样,这真的很慢吗?

2 个答案:

答案 0 :(得分:4)

JVM可以通过两种方式“检测”空值。

  • 可以明确测试。这代表了开销,但JIT 可以优化一些测试;例如如果一个方法在this上调用一个方法,它就不能给NPE,如果一个使用givem引用的调用没有,那么NPE那么另一个也不会。

  • 它可以使用虚拟内存硬件实现它。 JVM将其虚拟地址空间中的页面零映射到不可读+不可写的页面。由于null表示为零,因此当Java代码尝试取消引用null时,这将导致将“段错误”信号传递给JVM。 JVM的segfault信号处理程序可以捕获它,找出代码执行的位置,并在当前线程的堆栈上创建并抛出NPE。

    这很复杂且相当昂贵,但这并不重要,因为NPE在正常程序中应该很少见。

答案 1 :(得分:0)

NULLPointerException基本上是一个运行时异常,即JVM期望在执行任何操作时引用实际对象。

要更好地理解这一点,您需要知道如何在java.Here中创建和引用对象是语法: myClass o = new myClass();

在这种情况下,正在堆空间中创建一个对象,其中o作为对该对象的引用,即o基本上指向该对象。在运行时,JVM确定o指向的实际对象并使用它来执行操作。

所以我们假设您有一个方法doSomething()作为上述myClass定义的实例方法,并且您正在调用它,就像这样o.doSomething(),因此JVM将找到实际的对象并调用此方法。 / p>

但如果你设定 o = null;然后o没有指向myclass的实际对象,即o指向什么都没有。 所以现在在执行o.doSomething期间,JVM发现o指向什么都没有,并且在这种情况下抛出运行时异常NULLPointerException。

它并不慢,因为它是JVM的设计方式,对运行时发生的实际引用对象进行操作,如果你没有在程序中处理NULL检查并且JVM抛出NULLpointerException,那么程序崩溃和jvm终止。

有关详情,请参阅java doc: http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html