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