[英]While true loop being broken by a try/catch in Java
我是網絡的初學者,正在嘗試在我擁有的游戲中實現它,該游戲大部分都可以運行,但是在客戶端,我的接收數據包的循環正在停止嘗試捕獲。 這是代碼:
public void run() {
while(true){
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
}catch(IOException e){
e.printStackTrace();
}
this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
}
}
調試后,我發現循環沒有越過try catch語句。(但是try似乎被激活一次,沒有錯誤)。
首先,您提供的循環條件不是variable
,您直接使用了布爾值true
。 可能是infinite-loop
。
while(true){..... // yourCode ....}
即使socket.receive(packet);
您的循環也將繼續socket.receive(packet);
引發IOException
因為此異常由catch()
塊處理。
這意味着它將一直執行到此行引發任何異常為止
this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
現在,您的問題是此方法public void receive(DatagramPacket p)
實際上方法將一直工作到收到datagram
為止,但是您的循環將繼續進行,直到引發異常,直到this.parsePacket()
方法引發Exception。
因此,請更改您的條件語句,以便如果不再存在
datagram
,則必須終止循環。
根據方法的java-docs public void receive(DatagramPacket p)
該方法將阻塞,直到接收到數據報為止。
執行流的線程被阻塞[等待直到接收到數據報]。 您的循環並沒有因此而處於中斷狀態。 如果發生某些異常,並且該異常未在循環主體中捕獲和處理,則循環將被破壞。
另外,我也很少建議您在代碼中實現。 您不應該運行無限循環。 除了使用true
還可以嘗試使用Thread.currentThread().isInterrupted()
並且當游戲結束時,您可以在負責執行循環代碼流的Thread上調用interrupt()
。 同樣,如果在IOException的情況下您希望重試(可能是重試中的資源是有序的,但是您沒有得到異常),那么將catch放入循環中就可以了,否則您可以將catch移到循環外,這取決於您的需要和流動。 您可以為重試次數設置一個計數器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.