Java重写Runnable.run()抛出InterruptedException不兼容如何解决
报错原因:throws子句不兼容的含义
Java方法重写有明确的异常约束规则:实现类/子类重写父类或接口的方法时,声明抛出的受检异常(Checked Exception)不能超出原方法声明的异常范围。Runnable接口的原生run()方法签名没有声明任何受检异常:
@FunctionalInterface public interface Runnable { void run(); }
你在重写的run()方法上添加throws InterruptedException声明,而InterruptedException属于受检异常,相当于扩大了原方法允许抛出的异常范围,违反了重写规则,编译器就会抛出"throws子句不兼容"的错误。
修复方案
重写Runnable.run()时不能向外抛出任何受检异常,必须在方法内部捕获start.await()触发的InterruptedException做处理。
修正后的代码如下:
private final CountDownLatch start = new CountDownLatch(1); private final int eCount = ...; public void run(){ for(int e = 0;e<eCount;++e){ new Thread(new Runnable() { @Override public void run() { try { start.await(); // 此处编写线程执行的业务逻辑 } catch (InterruptedException e) { // 捕获中断异常后建议恢复线程中断标记,不要直接吞掉异常导致上层无法感知中断 Thread.currentThread().interrupt(); } } }).start(); } }
注意:捕获InterruptedException后不要空处理直接吞掉中断信号,调用Thread.currentThread().interrupt()恢复中断状态是比较规范的实践,能保证上层调用逻辑可以正常感知到线程中断事件。
内容的提问来源于stack exchange,提问作者Troskyvs
相关产品推荐
相关产品推荐

