Java 奇数NullPointerException

Java 奇数NullPointerException,java,Java,我的NPE中的Stacktrace以以下内容开头: Caused by: java.lang.NullPointerException at pl.yourvision.crm.web.servlets.listExport.ProductListExport.writeCells(ProductListExport.java:141) 此文件中的行号141是: Double availablePieces = store != null ? store.getAvailablePie

我的NPE中的Stacktrace以以下内容开头:

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不为null,store.getAvailablePieces()为null。我不明白为什么我在这里会有例外


有什么想法吗?

我99%肯定这是因为条件运算符的行为。我相信您的代码相当于:

double tmp = store != null ? store.getAvailablePieces() : 0.0;
Double availablePieces = tmp;
换句话说,它将
store.getAvailablePieces()
的结果解装箱到
double
,然后装箱回到
double
。如果
store.getAvailablePieces()
返回
null
,则确实会导致
NullPointerException

修复方法是使第三个操作数
也加倍:

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;

相信JVM。IDE和调试器将帮助您解决此问题。@Zimi store.getAvailablePieces()没有问题,因为store不为null。但我怀疑,由于getAvailablePieces()为null,因此它将为双包装器引用的availablePieces分配null。在下面的代码中,检查自动装箱/取消装箱发生的情况。这可能会导致NPE。当您给出
(double)0.0时,Eclipse似乎给出了一个错误,无法从double转换为double。知道为什么吗?@R.J:不完全确定,但我已经把它改为直接使用Double.valueOf now:)@Obalix:你的编辑显著地改变了很多帖子的意思。<代码>双< /代码>和<代码>双< /代码>之间的区别是至关重要的——唯一需要修复的拼写错误是在一些文本的中间(“代码> Dobule < /代码>,我想”)。我已经回滚了您的编辑。@JonSkeet我没有这样想过,但您肯定是对的。感谢you@JonSkeet抱歉,我试图修复我在早期编辑中看到的问题,这也更正了拼写。