Double! = Null вызывает исключение NullPointerException - PullRequest
5 голосов
/ 23 августа 2010

У меня есть следующий фрагмент кода, который меня беспокоит, где currentRate и secondCurrentRate являются объектами Double, правильно определенными:

(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;

Это должно проверять каждый объект Double на нулевое значение и присваивать значениесоответственно ноль.Однако если значение secondCurrentRate равно нулю, это вызывает исключение NullPointerException.Я изменил фрагмент кода следующим образом:

(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate;

И это работает, как и ожидалось.Мой вопрос: почему это происходит?Я мог бы понять это, если бы я вызывал какой-то метод для объектов, но я понимал, что исключения NullPointerException были вызваны при вызове метода для нулевого объекта.Существует нулевой объект, но нет вызова метода.

Может кто-нибудь предложить какое-либо понимание этого?Это работает в Java 5.

Ответы [ 2 ]

5 голосов
/ 23 августа 2010

Я думаю, что ваша проблема в другом месте.

Это работает:

    Double currentRate=null, secondCurrentRate =null;
    Double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;

Но если вы сделали это, это вызовет NPE:

    Double currentRate=null, secondCurrentRate =null;
    double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;
1 голос
/ 23 августа 2010

Тип условного оператора на самом деле довольно сложный верю , что происходит в вашем первом примере, таково: второй операнд условного выражения

currentRate * secondCurrentRate

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

Причина второго выраженияРаботы обусловлены несколько иной семантикой условного выражения в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...