所以我试图每隔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);
}
感谢您的帮助。
答案 0 :(得分:1)
如果你真的需要抛出一个异常,你可以使用catch异常包围整个run()块,并在RuntimeException或它的任何现有子类中封装任何catched异常(你也可以创建一个)。另一个选择是仅在你的方法中这样做(如果你只是想传播你的方法的例外。我不确定你在寻找什么,但希望它有所帮助。
通常,只有当执行它的人能够在抛出异常时才能执行操作时,您才会抛出一个已检查的异常。如果没有可能的"反击行动"抛出一个未经检查的东西总是更好。在这种情况下,由于您的方法是私有的并且只在run()方法中使用,我认为抛出一个已检查的异常没有意义,所以我只是将它封装在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以获取有关已检查和未检查的例外用法的详细信息。