虽然真正的循环被Java中的try / catch破坏了

时间:2016-04-18 01:56:02

标签: java while-loop try-catch

我是网络的初学者,正在努力在我拥有的游戏中实现它,它主要是工作但在客户端我的循环接收数据包正在停止尝试捕获。这是代码:

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似乎被激活了一次,看似没有错误)。

2 个答案:

答案 0 :(得分:2)

首先,您提供的循环条件不是variable,您直接使用了布尔值true。这可能是infinite-loop

的情况
 while(true){..... // yourCode ....}

即使socket.receive(packet);行引发IOException,您的循环也会继续,因为catch()阻止了此异常。

这意味着它将执行,直到此行引发任何异常

this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());

现在,您的问题是这个方法public void receive(DatagramPacket p)实际上方法将一直有效,直到收到datagram但是您的循环将继续,直到异常被提出,直到this.parsePacket()方法引发异常。

  

因此,请更改您的条件语句,以便如果datagram不再存在,则必须终止循环。

答案 1 :(得分:1)

根据方法public void receive(DatagramPacket p)

的java-docs
  

此方法将一直阻塞,直到收到数据报。

执行流程的线程被阻塞[等待直到收到数据报]。你的循环没有被打破,只是处于暂停状态。 如果发生某些异常,循环将被破坏,这个异常不会在循环体的一侧被捕获和处理。

此外,我希望您在代码中实现的建议很少。你不应该运行无限循环。您可以尝试使用true而不是使用Thread.currentThread().isInterrupted(),当游戏结束时,您可以在负责执行循环代码流的线程上调用interrupt()。此外,如果在IOException的情况下你想重试(可能在重试资源是有序的,你没有得到异常)然后把catch放在循环中是O.K.否则你可以将捕获物移到循环外面,这取决于你的需要和流量。您可以为重试次数设置一个计数器。