簡體   English   中英

雖然真正的循環被Java中的try / catch破壞了

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM