2017-08-31 3 views
4

私はファイルを読むことでいくつかの練習をしていますが、私は不平衡ファイルのためのファイルインターリーブコードを書くことが任されています。&&を||に変更する理由変数が見えなくなっています

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

注& & ...しかし、私は||ためにそれを変更した場合:私はこのような設定のものを持っているので、もしそれが正常に動作しますNetBeansは(それは完全に罰金このようinputLine1を見ているが)inputLine2が初期化されていないと述べている:inputLine1は(これは、ファイルAからのデータである)最初のヌルになると今

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

を、私は他のすべての行を取得しますin 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

それはそれを得ました!ありがとう! 1つの愚かな小さな線......... –

答えて

3

これはshort-circuit evaluationと呼ばれます。ブール式の値が1つのオペランドの結果によって決定される場合、2番目の式は評価されません。

この例では、&&||の間で変更しています。 &&式が真であるためには、両辺が真でなければならないので、最初のものが真であれば両方の辺が評価されます(最初のものが偽の場合は短絡します)。 ||式の場合、少なくとも1つの条件を満たす必要があります。最初のものが真であるため、2番目のものは問題ではないので、評価されません。あなたは左側のtruthinessを反転した場合

は、あなたがオブザーバー反対ます:あなたが期待するとしてあなた||式は動作しますが、あなたの&&式はinputLine2が初期化されていないになります。

5

Javaはlazy/short-circuit evaluationを行います。 ||に変更すると、それが気になるすべてが真であることが確認されます。最初の条件が真であれば、それは残りの条件を見落とし、その変数をゼロにします。

条件の中の初期化変数は絶対にありません。物事が乱れることがあります。

関連する問題