2012-03-15 32 views
0

我有一塊未註釋的代碼,我試圖理解。評論是我自己的。這個循環會多少次讀取輸入流?

//create an array name header that holds 4 bytes 
byte header[] = new byte[4]; 
int len = 0; 
int c = -1; 

for(; len != 3; len += c)// run loop till len = 3 
{ 
    try 
    { 
    //first run of the loop following should be true 
    //read 3 bytes and save into header array starting at 0 
    // c = number of bytes read (most likely 3 after first run of loop) 

    c = is.read(header, len, 3 - len); 

    } 
    catch(Exception e) 
    { 
    System.err.println("read header error " + e.getMessage()); 
    displayErrorMessage(e); 
    } 
    if(c == -1) 
    return null; 

} 

此代碼讀取輸入流,但我不知道有多少次將循環。 我試圖通過在紙張上循環運行,取代len每次c和後7次迭代LEN仍然不等於3.

在循環期間的第二次運行,LEN應等於-1和c應該等於3。 -1應該使讀取方法拋出一個IndexOutOfBoundsException,因爲您試圖將從流中讀取的字節保存到標頭[-1]。因此,由於引發了異常,從循環的第一次運行開始,c的值將保持等於3。

我是否正確地認爲自從異常被捕獲後,for循環不會退出?

+1

len怎麼能最終成爲-1? – 2012-03-15 16:21:28

回答

3

循環將被重複的次數不確定,因爲read()可能在第一次運行時讀取3個字節,並終止 - 或者它可能一次讀取1個字節,並重復3次。

但是,正如註釋所說 - 很可能read()將在第一次迭代期間讀取3個字節,並且循環將只有一次迭代。
對於這種情況,什麼情況如下:

  1. 檢查,如果len < 3 - 這是
  2. 讀3個字節數組,並設置c = 3
  3. 檢查,如果c == -1 - 它不是
  4. 結束loop:set len = len + c = 3
  5. 檢查是否len < 3 - 它不是:終止循環
+0

我在邏輯中的錯誤並沒有意識到增量表達式在循環中每次迭代之後被調用。我假設它是在循環運行之前,但變量直到循環之後才改變。謝謝。 – jmm 2012-03-15 16:44:48