在runnable中抛出异常

时间:2016-10-06 07:04:07

标签: java exception runnable packet datagram

所以我试图每隔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);

}

感谢您的帮助。

1 个答案:

答案 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以获取有关已检查和未检查的例外用法的详细信息。