我正在做一些阅读文件的练习,我的任务是为不平衡文件编写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);
}
}
答案 0 :(得分:5)
Java做lazy/short-circuit evaluation。当你改为||
时,它所关心的只是确保一个是真的。如果第一个条件为真,它将停止查看其余条件,使该变量为空。
一个好的经验法则是永远不要在条件句中初始化变量,事情会变得混乱。
答案 1 :(得分:3)
这称为short-circuit evaluation。如果可以通过一个操作数的结果确定布尔表达式的值,则不评估第二个值。
在此示例中,您需要在&&
和||
之间进行更改。如果&&
表达式为真,则双方必须为真,因此如果第一个为真,则评估双方(如果第一个为假,则会短路)。对于||
表达式,必须满足至少一个条件;因为第一个是真的,所以第二个是什么并不重要,所以它没有被评估。
如果你颠倒左侧的真实性,你会反过来观察:你的||
表达式会按预期工作,但你的&&
表达式会导致{{1}没有被初始化。