2012-08-07 171 views
0

通過一些教程去約插座,我把未來整個代碼那樣:Java:閱讀循環如何逃脫?

while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
    } 

的問題是:如何離開這個循環?只有通過catch,一旦receive()完成了?

更確切地說,這裏是我做了什麼:

while(true) { 
     try { 
      socket.receive(answer); 
      resultString = new String(answer.getData(), 0, answer.getLength(), "ASCII"); 

      if (isMyIdentifier(resultString)) { 
       gatewayIP = answer.getAddress().getHostAddress(); 
       return true; 
      } else { 
       return false; 
      } 
     } 
     catch (SocketTimeoutException e) { 
      throw new GatewayNotReachableException(); 
     } 
    } 

,但我一直想出一個TimeoutException,雖然讀是正確的。所以我想知道,如果例外是'預期'的方式離開。儘管我認真地懷疑...和socket.receive(packet)是什麼,拋出了異常。

+0

您可以使用'break'聲明:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html – 2012-08-07 12:50:53

+0

沒有'catch'在此代碼。 – 2012-08-07 12:51:32

+0

@HunterMcMillen他不問他如何能完成工作,他問的是代碼(取自教程)是如何工作的。 – 2012-08-07 12:51:39

回答

0

在下面的代碼有一個連續while loop,這似乎是一個合適的實現,但有些服務器必須的趨勢繼續聽,同時處理請求。

這個while循環永遠不會退出!

while(true){ 
    socket.receive(packet); 
    String message = new String(packet.getData(),0,packet.getLength(), TEXT_ENCODING); 
    System.out.println(message); 
    } 
+0

之後的return語句那樣,如果在這種情況下,我實際上只期望一個答案,receive()會等待第一個進來,然後繼續?意思是,簡單地刪除循環應該做的伎倆... – 2012-08-07 13:03:09

+0

是的,如果你期望只有一個套接字進來,只是不要循環。 – 2012-08-07 13:40:20

4

相信與否,你不希望所有的循環終止。

一個經典的例子是一個簡單的循環,監聽請求,處理請求,然後再次等待 - 「永遠」。這基本上就是你的代碼示例。

答案是「這個循環不剩」,這就是你想要的。

+0

+1,但是專門針對預先編輯的問題(即提供的第一個代碼塊) – 2012-08-07 13:01:14

0

循環從不離開,這是服務器熬夜的全部目的。

或者你想讓服務器接收一個客戶端調用然後關機?

0

循環不會被打破,除非內部發生錯誤。

0

這兩個代碼塊意味着非常不同的功能意義。

第一個人似乎說:「我希望我的請求處理程序無限期運行,直到我自己手動退出程序!」這是合理的說法。

但第二塊代碼是完全不同的。你進入循環,但不會多次循環,因爲isMyIdentifier(resultString)是真的,在這種情況下,你退出方法(和當然循環),或者它不是在這種情況下你仍然退出的方法。在這種情況下,循環根本沒有做任何事情。

此外,異常處理爲您的第二塊代碼退出循環提供了另一種方式。至於爲什麼它是拋出一個例外,這是另一個問題。

+0

因此,正如我想到的上面的一條評論,完全消除循環恰好是正確的!在此期間我已經完成了,這讓我擺脫了這個例外。 – 2012-08-07 13:30:10

+0

我無法想象單獨的循環會導致異常,因爲在內部代碼塊中循環沒有任何作用。返回語句退出整個方法,並且你的if的兩個分支都有返回語句。它永遠不會到達你的循環的關閉'}'來重複。我會刪除它,只是因爲它的代碼什麼都沒做,就像在返回語句 – 2012-08-07 13:39:18