为什么改变&&到||导致变量无法看到

时间:2017-08-31 19:31:23

标签: java file loops while-loop

我正在做一些阅读文件的练习,我的任务是为不平衡文件编写File Interleave代码。所以,如果我有这样的设置,它可以正常工作:

while ((inputLine1 = LineSequential.read(inFileStreamName1)) != null **&&** (inputLine2 = LineSequential.read(inFileStreamName2)) != null) 

请注意&& ...但如果我将其更改为|| netbeans声明inputLine2尚未初始化(尽管它以这种方式看到inputLine1非常好):

while ((inputLine1 = LineSequential.read(inFileStreamName1)) != null **||** (inputLine2 = LineSequential.read(inFileStreamName2)) != null)

现在,如果inputLine1(这是来自文件A的数据)首先变为空,我只得到inputLine2中的每一行(来自文件B)。在每次循环迭代中,它跳过一条线。我很确定它与我初始化inputLine2的地方有关..:

while ((inputLine1 = LineSequential.read(inFileStreamName1)) != null || LineSequential.read(inFileStreamName2) != null) {           
    inputLine2 = LineSequential.read(inFileStreamName2);
    System.out.println(inputLine2);
    if(inputLine1 != null && inputLine2 == null){
    LineSequential.write(outFileStreamName, inputLine1);
    }else if(inputLine1 == null && inputLine2 != null){
        LineSequential.write(outFileStreamName, inputLine2);
    }
    else if(inputLine1 != null && inputLine2 != null){
       LineSequential.write(outFileStreamName, inputLine1);
       LineSequential.write(outFileStreamName, inputLine2); 
    }
}

2 个答案:

答案 0 :(得分:5)

Java做lazy/short-circuit evaluation。当你改为||时,它所关心的只是确保一个是真的。如果第一个条件为真,它将停止查看其余条件,使该变量为空。

一个好的经验法则是永远不要在条件句中初始化变量,事情会变得混乱。

答案 1 :(得分:3)

这称为short-circuit evaluation。如果可以通过一个操作数的结果确定布尔表达式的值,则不评估第二个值。

在此示例中,您需要在&&||之间进行更改。如果&&表达式为真,则双方必须为真,因此如果第一个为真,则评估双方(如果第一个为假,则会短路)。对于||表达式,必须满足至少一个条件;因为第一个是真的,所以第二个是什么并不重要,所以它没有被评估。

如果你颠倒左侧的真实性,你会反过来观察:你的||表达式会按预期工作,但你的&&表达式会导致{{1}没有被初始化。