2014-01-23 6 views
6

StackTrace из моего NPE начинается с:Одд NullPointerException

Caused by: java.lang.NullPointerException 
    at pl.yourvision.crm.web.servlets.listExport.ProductListExport.writeCells(ProductListExport.java:141) 

номер строки 141 в этом файле:

Double availablePieces = store != null ? store.getAvailablePieces() : 0.0; 

Где магазин не утратившим store.getAvailablePieces() равно нулю. Я не понимаю, почему я здесь получаю исключение.

Любые идеи?

+2

Верьте в JVM. IDE и отладчик помогут вам разобраться в этом. – duffymo

+1

@ Zimi Нет проблем с store.getAvailablePieces() как магазин не является нулевым. Но я подозреваю, что поскольку getAvailablePieces() имеет значение null, он присваивает значение null доступным элементам, который имеет ссылку Double Wrapper. В дальнейшем вниз проверка кода происходит при автобоксинге/распаковке. Это может вызвать NPE. – Jigar

ответ

19

Я на 99% уверен, что это связано с поведением условного оператора. Я считаю, что ваш код эквивалентен:

double tmp = store != null ? store.getAvailablePieces() : 0.0; 
Double availablePieces = tmp; 

Другими словами, это распаковка результат store.getAvailablePieces() к double, то бокс обратно Double. Если store.getAvailablePieces() возвращает null, это действительно вызовет NullPointerException.

Исправление сделать третий операнд Double а:

Double availablePieces = store != null ? store.getAvailablePieces() 
             : Double.valueOf(0.0); 

Теперь не будет бокс или распаковка, так что это хорошо для store.getAvailablePieces() вернуться null. Вместо этого вы можете использовать 0.0, но это другое дело. Если вы собираетесь это сделать, вы можете изменить на:

Double tmp = store != null ? store.getAvailablePieces() : null: 
double availablePieces = tmp == null ? 0.0 : tmp; 
+1

Eclipse, кажется, дает ошибку * Невозможно использовать от double to Double *, когда вы даете '(Double) 0.0;' в тернарном операторе. Любая идея почему? – SudoRahul

+2

@ R.J: Не совсем уверен, но я изменил его, чтобы просто явно использовать Double.valueOf сейчас :) –

+2

@Obalix: ваше изменение значительно изменило значение * лота * сообщения. Разница между «Двойным» и «двойным» имеет решающее значение - единственной ошибкой орфографии, которая необходима для исправления, была одна в середине некоторого текста («Думаю», я думаю). Я откат вашего редактирования. –