我正在做一些阅读文件的练习,而且我的任务是为不平衡的文件编写文件交错代码。因此,如果我进行了这样的设置,则效果很好:

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的数据)首先变为null,那么我只会得到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);
    }
}

最佳答案

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

在此示例中,您将在&&||之间切换。为了使&&表达式为true,双方都必须为true,因此如果第一方为true,则对双方进行评估(如果第一方为false,则短路)。对于||表达式,必须至少满足以下条件之一;因为第一个是正确的,所以第二个是什么并不重要,因此不进行评估。

如果您反转左侧的真实性,您会发现相反的情况:||表达式将按预期工作,但是&&表达式将导致inputLine2未初始化。

07-26 07:53