代码之家  ›  专栏  ›  技术社区  ›  user8072194

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

  •  4
  • user8072194  · 技术社区  · 7 年前

    我正在做一些阅读文件的练习,我的任务是为不平衡的文件编写文件交错代码。因此,如果我有这样的设置,它可以很好地工作:

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

    注意(&A)&。。。但如果我将其更改为| | 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); 
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Loaf    7 年前

    lazy/short-circuit evaluation . 当您更改为 || 它所关心的是确保一个是真实的。如果第一个条件为true,它将停止查看其余条件,使该变量为null。

    一个好的经验法则是永远不要在条件内初始化变量,事情可能会变得一团糟。

        2
  •  2
  •   yoozer8    7 年前

    short-circuit evaluation

    在本例中,您将在 && || && 表达式要为true,两侧都必须为true,因此如果第一个为true,则对两侧进行求值(如果第一个为false,则短路)。对于 表达式中,至少必须满足一个条件;由于第一个是真的,第二个是什么无关紧要,因此不进行评估。

    如果你颠倒左边的真实性,你会看到相反的结果:你的 表达式将按预期工作,但您的 && 表达式将导致 inputLine2