在runnable中抛出异常
Throwing exception in runnable
所以我尝试每 3 秒发送一次数据包,并尝试使用这样的 Schedule Executor 服务:
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new broadcast(), 0, 3, TimeUnit.SECONDS);
然而,为了能够发送数据包,需要抛出异常。我正在努力寻找一种能够抛出此异常的方法。我试过将它封装在 try, catch 语句中,但没有成功。
static class broadcast implements Runnable{
public void run() {
Iterator iterator = hash.keySet().iterator();
while(iterator.hasNext()){
char c = iterator.next().toString().charAt(0);
int[] a = hash.get(c);
int sendPort = a[1];
byte[] buffer = new byte[1024];
buffer = linkState.toString().getBytes();
System.out.println(a[0] + " " + a[1]);
DatagramPacket sent = new DatagramPacket(buffer, buffer.length, sendAddress, sendPort);
send(sent); //this line here is the problem
}
}
}
private static void send(DatagramPacket sent) throws Exception{
socket.send(sent);
}
感谢您的帮助。
如果你真的需要抛出异常,你可以用异常捕获包围整个 运行() 块,并将任何捕获的异常封装在 RuntimeException 或其任何现有子类中(你可以也创建一个)。另一种选择是只在你的方法内部这样做(如果你只是想传播你的方法的异常。我不太确定你在寻找什么,但希望它有所帮助。
通常,只有在抛出异常时执行它的人能够做某事时,您才会抛出已检查的异常。如果没有可能 "counter action" 最好扔一个未经检查的。在这种情况下,由于您的方法是私有的并且仅在 运行() 方法内部使用,我认为抛出检查异常没有意义,因此我将它封装在 RuntimeException 中,如下所示:
编辑:正如 Marko Topolnik 指出的那样,这包装了 socket.send 抛出的所有未经检查的异常,因此您可以先重新抛出所有未经检查的异常:
private static void send(DatagramPacket sent) throws Exception{
try{
socket.send(sent);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new RuntimeException("error sending package through socket", e);
}
}
检查 this article 以获取有关已检查和未检查异常用法的更多信息。
所以我尝试每 3 秒发送一次数据包,并尝试使用这样的 Schedule Executor 服务:
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.scheduleWithFixedDelay(new broadcast(), 0, 3, TimeUnit.SECONDS);
然而,为了能够发送数据包,需要抛出异常。我正在努力寻找一种能够抛出此异常的方法。我试过将它封装在 try, catch 语句中,但没有成功。
static class broadcast implements Runnable{
public void run() {
Iterator iterator = hash.keySet().iterator();
while(iterator.hasNext()){
char c = iterator.next().toString().charAt(0);
int[] a = hash.get(c);
int sendPort = a[1];
byte[] buffer = new byte[1024];
buffer = linkState.toString().getBytes();
System.out.println(a[0] + " " + a[1]);
DatagramPacket sent = new DatagramPacket(buffer, buffer.length, sendAddress, sendPort);
send(sent); //this line here is the problem
}
}
}
private static void send(DatagramPacket sent) throws Exception{
socket.send(sent);
}
感谢您的帮助。
如果你真的需要抛出异常,你可以用异常捕获包围整个 运行() 块,并将任何捕获的异常封装在 RuntimeException 或其任何现有子类中(你可以也创建一个)。另一种选择是只在你的方法内部这样做(如果你只是想传播你的方法的异常。我不太确定你在寻找什么,但希望它有所帮助。
通常,只有在抛出异常时执行它的人能够做某事时,您才会抛出已检查的异常。如果没有可能 "counter action" 最好扔一个未经检查的。在这种情况下,由于您的方法是私有的并且仅在 运行() 方法内部使用,我认为抛出检查异常没有意义,因此我将它封装在 RuntimeException 中,如下所示:
编辑:正如 Marko Topolnik 指出的那样,这包装了 socket.send 抛出的所有未经检查的异常,因此您可以先重新抛出所有未经检查的异常:
private static void send(DatagramPacket sent) throws Exception{
try{
socket.send(sent);
}catch(RuntimeException e){
throw e;
}catch(Exception e){
throw new RuntimeException("error sending package through socket", e);
}
}
检查 this article 以获取有关已检查和未检查异常用法的更多信息。