Java 奇数NullPointerException
我的NPE中的Stacktrace以以下内容开头: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
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抱歉,我试图修复我在早期编辑中看到的问题,这也更正了拼写。