在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 以获取有关已检查和未检查异常用法的更多信息。