Java布尔和null奇怪

时间:2015-06-15 07:53:12

标签: java boolean

有人可以帮助我理解为什么我的代码可以生成以下输出吗?

请注意,f这里是出于调试目的,f [0] =(lastLine!= null)只是等同于lastLine!= null测试,所以它不是bug。

boolean f[] = new boolean[6];
if (f[0]=(lastLine!=null) // есть следующая строка
    || (f[1]=isEdgeTime) // конец сессии 
    || (f[2]=td.getHour() <10) // или уже утро, после полуночи все свечки хороши
    || (f[3]=(td.getHour() == 23 && td.getMinute() >=50))
    || (f[4]=currServerHour > lineHour) // или час сменился
    || (f[5]=currServerMinutesPeriod > linesMinutesPeriod)
){
    answer.append(classCode).append(".")
          .append(TickerUtils.getRoot(ticker))
          .append(";").append(minutes).append(";")
          .append(line)
          .append("\n");
    System.out.println(Arrays.toString(f));
    if (f[0])
        System.out.printf("\"%s\" : %d, currServerMinute=%d; %d > %d\n", lastLine, (lastLine!=null? 1: 0), currServerMinute, currServerMinutesPeriod, linesMinutesPeriod);
    line = lastLine;
} 

输出:

[true, false, false, false, false, true]
"null" : 0, currServerMinute=50; 10 > 9

我无法理解为什么“lastLine”不为空,因为f[0]为真且同时lastLine != null给我假,所以它实际上是null,实际上,这是怎么回事是

3 个答案:

答案 0 :(得分:4)

如果您要分配给f[0]以下内容:

(lastLine!=null) // есть следующая строка
|| (f[1]=isEdgeTime) // конец сессии 
|| (f[2]=td.getHour() <10) // или уже утро, после полуночи все свечки хороши
|| (f[3]=(td.getHour() == 23 && td.getMinute() >=50))
|| (f[4]=currServerHour > lineHour) // или час сменился
|| (f[5]=currServerMinutesPeriod > linesMinutesPeriod)

因此即使f[0]为空,lastLine也可以为真。

尝试将您的条件更改为:

if ((f[0]=(lastLine!=null)) // есть следующая строка
    || (f[1]=isEdgeTime) // конец сессии 
    || (f[2]=td.getHour() <10) // или уже утро, после полуночи все свечки хороши
    || (f[3]=(td.getHour() == 23 && td.getMinute() >=50))
    || (f[4]=currServerHour > lineHour) // или час сменился
    || (f[5]=currServerMinutesPeriod > linesMinutesPeriod)
)

如果您希望f[0]包含(lastLine!=null)的值。

这将照顾f[0]的价值。但是,如果f[i]对于任何i都属实,f[i+1]由于||条件的短路评估而无法进行评估,那么您就可以了true数组中最多只有一个f值。我不确定这是不是你想要的。

答案 1 :(得分:1)

您应该阅读Java中的运算符优先级:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

具体来说,在您的代码中,f[0]不仅仅是(lastLine!=null)的结果,而是整个布尔表达式,因为OR运算符||优先于赋值运算符{ {1}}。所以你的第一行等同于(我添加了括号以使运算符优先显式):

=

但一般建议: 切勿在测试中使用作业的结果。是的,它是合法的Java,但它的风格很糟糕,因为它很快就会让你感到困惑,正如你所发现的那样。请记住,代码只写了一次,但是读了很多次,所以对于下一个阅读它的人来说,这很重要。

答案 2 :(得分:-1)

尝试在if语句之外进行分配。 这可能会导致更改的原因是因为我们知道if语句将在第一个真实条件下退出。编译器和/或运行时解释器可能会重新调整if语句的性能(即分支前缀)注意事项。