我正在做一些阅读文件的练习,而且我的任务是为不平衡的文件编写文件交错代码。因此,如果我进行了这样的设置,则效果很好:
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
未初始化。