2015-12-01 33 views
-4

我有以下JAVA代碼,其中的情況是在NIO應用程序的Runnable中。while循環內的Java切換

隨着應用程序的一部分,我想myBuffer

while ((bytesRead = myChannel.read(myBuffer)) > 0) { 
     myBuffer.flip(); 
     myBuffer.mark(); 

     //... do stuff ... 

     switch (myType) { 
      case '1': 
       // ... read buffer and do stuff ... 
       break; 
      case '2': 
       // ... read buffer and do stuff ... 
       break; 
     } 
    } 
    // I should not be here 

的我已經注意到,休代替打破了switch語句,正在打破while循環,送我去I should not be here的內容進行解碼。

有沒有辦法阻止這種行爲並將過程發回myBuffer.flip()?

完整的代碼是在這裏:

https://github.com/trixpan/nifi-lumberjack-bundle

+0

你試過用繼續而不是休息嗎? – Karura91

+0

你確定'myChannel.read'返回> 0嗎? –

+3

沒有標籤的break語句嘗試將控制轉移到最內層的閉包交換機,while,do或for直接包含方法或初始化程序的語句;看看[規範](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.15) –

回答

3

actual code寫着:

logger.info("We are outside the loop and position is " + String.valueOf(socketBuffer.position())); 

此消息的文本是不正確 - 它是裏面的這個循環。

你的主要問題可能是您:

while ((bytesRead = myChannel.read(myBuffer)) > 0) 

由於NIO是異步這是很可能的read返回0。 Thjis並不表示該通道已完成 - 僅表示通道目前沒有更多數據,此時爲。你真的應該使用:

while ((bytesRead = myChannel.read(myBuffer)) >= 0) 

和你自己處理== 0情況。

+0

不會像我一直在玩他們那樣對消息的文本過分關注。該行指的是switch語句,但在嘗試瞭解行爲時轉移了位置。 –

+0

@AndredeMiranda - 添加了有關可能問題的更多詳細信息。 – OldCurmudgeon

+0

有一個問題,NIO實際上可以讀取任何數量的字節,直到myBuffer.length,不僅是0,-1或全部。 –

1

您可以使用一個標籤,它會教你如何標記一個循環,但是沒有它在這個例子中,它正在同樣的方式:

 while ((bytesRead = myChannel.read(myBuffer)) > 0) { 
       myBuffer.flip(); 
       myBuffer.mark(); 

       //... do stuff ... 

       choose: switch (myType) { 
        case '1': 
         // ... read buffer and do stuff ... 
         break choose; 
        case '2': 
         // ... read buffer and do stuff ... 
         break choose; 
        } 
       } 
       // I should not be here 
} 

但它工作正常,案件破案只是案件,你的一段時間可能會結束,你被這件事情所淹沒。

+0

教導請求的人,因爲案件中斷,不會因此而中斷循環。 –

+0

@KrzysztofCichocki對教學的好的呼籲,但我之前嘗試過。我猜這代碼中有些東西被破壞了,但我真誠地看不到它。 : - \ –

3

我上面張貼的答案感到驚訝,我想我有關於如何運行的Java代碼和break可能打破while循環,但誤用簡單的Java代碼我試圖清除一些誤解:

Random r = new Random(); 
    while (true) 
    { 
     System.out.println(" Inside while"); 
     int myType = r.nextInt(); 

     switch (myType) { 
     case 1: 
      // ... read buffer and do stuff ... 
      break; 
     case 2: 
      // ... read buffer and do stuff ... 
      break; 
     default : 
     break; 
     } 
    } 
    System.out.println(" Outside while"); 

令我吃驚的是,Java代碼在System.out.println(" Outside while");無法訪問的代碼上發生了異常。

所以,我相信,在你的問題休息while由於條件while ((bytesRead = myChannel.read(myBuffer)) > 0)或者你有一些錯位的break語句外switch

+1

,解釋很簡單:**'break'不會在像Java這樣的語言中傳播**。在其他語言中,這實際上是可能的。 – specializt

1

myChannel.read(myBuffer)不保證讀取myBuffer的整個長度,你需要寫出更好的閱讀方法,以確保你完全填充myBuffer,這可能是原因。