2016-04-30 3 views
0

Как виртуальная машина Java знает, когда бросать исключение NullPointerException? Проверяет ли он каждый метод, который я вызываю на объект, если объект имеет значение null, чтобы проверить, нужно ли ему перебрасывать исключение NullPointerException? И если так, разве это не так медленно?Как JVM знает, когда бросать исключение NullPointerException

ответ

4

Есть два способа, которыми JVM может использовать, чтобы «обнаружить» в аннулирует.

  • Он мог бы проверить явно. Это представляет собой накладные расходы, но JIT может оптимизировать некоторые из тестов; например если метод вызывает метод на this, он не может дать NPE, и если один вызов с использованием ссылки givem не будет тогда NPE, то другой тоже не будет.

  • Он может реализовывать его с использованием оборудования виртуальной памяти. JVM устраивает, что нулевая страница в своем виртуальном адресном пространстве отображается на страницу, которая нечитабельная + неприступная. Поскольку null представлен как ноль, когда код Java пытается разыменовать null, это приведет к передаче сигнала «segfault» в JVM. Обработчик сигналов segfault JVM может задержать это, выяснить, где выполнялся код, и создать и выбросить NPE в стек текущего потока.

    Это сложно и довольно дорого, но это не имеет значения, поскольку NPE должны быть редкими в обычной программе.

+0

В горячей точке оба подхода используются на основе информации профилирования типа/нулевого значения – the8472

0

NULLPointerException - это в основном исключение времени выполнения, т. Е. JVM ожидает, что фактический объект будет ссылаться, когда вы выполняете какую-либо операцию.

Чтобы понять это лучше, вам нужно знать, как создается объект и ссылаться в java.Here синтаксис: myClass o = new myClass();

В этом случае объект создается в кучном пространстве с o как ссылка на этот объект i.e o в основном указывает на этот объект. Во время выполнения JVM определяет фактический объект, на который указывает o, и используется для выполнения операции.

Так что давайте просто скажем, что у вас есть метод doSomething() как метод экземпляра для вышеуказанного myClass defintion, и вы вызываете его так, как это делает o.doSomething(), поэтому JVM найдет фактический объект и вызовет этот метод.

Но если вы установили o = null; то o не указывает на фактический объект myclass, то есть o не указывает на ничего. Итак, теперь во время выполнения o.doSomething JVM узнает, что o ничего не указывает и выбрасывает исключение NULLPointerException в этом случае.

Его не так, потому что его способ JVM разрабатывается, чтобы работать с объектами, на которые ссылаются объекты, которые происходят во время выполнения, и если вы не обрабатываете проверку NULL proproprly в своей программе, а исключение NULLpointerException выбрано JVM, то ваша программа сбои и jvm завершаются.

см Java документ для получения дополнительной информации: http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html

Смежные вопросы