【问题标题】:Throwing exception in runnable在runnable中抛出异常
【发布时间】:2017-02-14 19:40:51
【问题描述】:

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

}

感谢您的帮助。

【问题讨论】:

  • @BorisShchegolev 这会使程序进入睡眠状态,我需要它在后台运行。
  • 接受的答案是关于 Thread.UncaughtExceptionHandler 的使用,而不是关于 sleep

标签: java exception runnable packet datagram


【解决方案1】:

如果你真的需要抛出一个异常,你可以在整个 run() 块周围加上一个异常捕获,然后将任何捕获的异常封装在 RuntimeException 或其任何现有子类中(你也可以创建一个)。另一种选择是仅在您的方法内部这样做(如果您只想传播您的方法的异常。我不太确定您在寻找什么,但希望它有所帮助。

通常,只有在抛出异常时执行该异常的人能够做某事时,您才希望抛出已检查异常。如果没有可能的“反行动”,最好抛出一个未经检查的。在这种情况下,由于您的方法是私有的并且仅在您的 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 了解有关已检查和未检查异常使用的更多信息。

【讨论】:

  • 更好,但很尴尬。通常的成语是catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); }
  • 完成了,我记下了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2013-05-24
  • 1970-01-01
  • 2011-05-30
  • 2016-08-10
相关资源
最近更新 更多