if子句中的多个return语句的函数不按预期运行?

时间:2011-08-24 09:44:41

标签: java android if-statement

我对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,它获得一个空指针。 我对这里缺少的东西一无所知,有什么建议吗?

3 个答案:

答案 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();
在if语句之前然后将新的boolean放入return语句中,你会在调试器中看到不同的执行路径。

答案 2 :(得分:1)

right并不是null子句中唯一可以else的引用。 left.getAlertStart()也可能是null - 这可能是导致异常的原因。