2017-08-31 43 views
4

我正在做一些閱讀文件的做法,我的任務是爲非平衡文件編寫文件交錯代碼。所以,如果我有事情設置了這樣的正常工作:爲什麼要將&&更改爲||導致一個變量不被看到

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(這是從文件中的數據)成爲空第一,我只得到每個其他行在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

'||'是短路。改用'|'代替。 – shmosel

+0

明白了!謝謝!一條愚蠢的小線......... –

回答

3

這叫做short-circuit evaluation。如果一個布爾表達式的值可以由一個操作數的結果來確定,那麼第二個不會被求值。

在此示例中,您正在更改&&||。對於&&表達式爲真,雙方都必須是真實的,所以如果第一個是真的(如果第一個是假的,它將會短路)來評估雙方。對於||表達式,必須至少滿足一個條件;因爲第一個是真的,所以第二個是什麼並不重要,所以它不被評估。

如果反轉左側的感實性,你會觀察者相反:你||表達式將工作像您期望的,但會導致你的&&表達inputLine2沒有被初始化。

5

Java那樣lazy/short-circuit evaluation。當您更改爲||時,所有關心的都是確保一個是真實的。如果第一個條件爲真,則停止查看剩餘的條件,使該變量爲空。

一個好的經驗法則是從不初始化變量內部的條件,事情可能會變得混亂。

相關問題