我对Java编程并不陌生,但这个问题对我来说是闻所未闻的。 我有这段代码:
private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {
if(right == null) {
return !left.isReminded();
}
else {
return !left.isReminded() && (left.getAlertStart().before(right.getAlertStart()));
}
}
好的问题是我在“else”子句的行上得到一个空指针的报告。
当我调试时,我可以看到right
实际上是空的,但仍然是if-clause中的执行首先然后控制继续进入“else”-clause,它获得一个空指针。
我对这里缺少的东西一无所知,有什么建议吗?
答案 0 :(得分:2)
这有点混乱的If语句,我可能没有你的逻辑,但这应该对你更有意义:
private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {
if(right != null) {
return !right.isReminded();
} else {
return !left.isReminded();
}
}
你想要检查权利是否为空,如果不是这意味着你有一个'正确'的回调所以使用正确的对象,否则你假设你有一个左回调并使用它。
这段代码:
&& (left.getAlertStart().before(right.getAlertStart())
需要您检查左右空检查:
if(left != null && right != null){
return (left.getAlertStart().before(right.getAlertStart());
}
所以如果我有这个权利,你最终会得到:
private static boolean isEarlierThanAndNotReminded(Callback left, Callback right) {
boolean returnVal = false;
if(right != null) {
returnVal = !right.isReminded();
} else if (left != null){
returnVal = !left.isReminded();
}
if(left != null && right != null){
returnVal = returnVal && (left.getAlertStart().before(right.getAlertStart());
}
return returnVal;
}
答案 1 :(得分:2)
它可能只是编译器优化和调试器处理它的方式的函数。 它将进入'if'第一个条件,但不会实际执行返回。如果你考虑一下,无论如何 'right'的值是代码需要知道'!left.isReminded()'的值,因此必须执行该语句。我打赌如果你用
开始你的功能boolean leftRemindedValue = left.isReminded();
答案 2 :(得分:1)
right
并不是null
子句中唯一可以else
的引用。 left.getAlertStart()
也可能是null
- 这可能是导致异常的原因。