繁体   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