我实现了自己的Runnable。run(),它告诉我捕捉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() throws InterruptedException{
start.await(); //
}
}).start();
}
但编译错误现在是:
Exception InterruptedException is not compatible with throws clause in Runnable.run()Java(67109266)
“与抛出条款不兼容”是什么意思。如何解决这个问题?
接口Runnable
公开了这个方法:
public abstract void run();
此方法不抛出任何内容(仅抛出未经检查的异常)。
您得到的消息意味着您不能在该方法内抛出已检查的异常(例如InterruptedException),否则,它与run()签名不匹配。
一般来说,如果重写接口/抽象类的方法,则必须尊重它所施加的签名,这包括抛出列表(如果愿意,不能抛出已声明的异常,但不能抛出未声明的异常)。
关于如何修复,您可以将选中的异常包装在未选中的异常中:
@Override
public void run() {
try {
start.await();
} catch (InterruptedException e) { //<-- catch the checked exception
throw new RuntimeException("Interrupted", e); //<-- wrap it into an unchecked exception (you can also create your own, which I suggest, instead of using the generic RuntimeException)
}
}
问题内容: 谁能告诉我异常产生的原因有哪些,与“ throws”子句不兼容 例如: 异常异常与Super.foo()中的throws子句不兼容 问题答案: 没有完整的代码示例,我只能猜测:您正在重写/实现子类中的方法,但是子类方法的异常规范与父类/接口方法的异常规范不兼容(即,不是其子集)? 如果声明基本方法根本不抛出异常,或者例如(这是您的方法的子类正在尝试在此处抛出),则可能发生这种情况。基类
问题内容: 我需要直接等于的东西,但可以重置(保持线程安全!)。我不能使用经典的同步构造,因为它们在这种情况下根本无法工作(复杂的锁定问题)。目前,我正在创建许多对象,每个对象都替代了上一个对象。我相信这是在GC的年轻一代中实现的(由于对象数量众多)。您可以在下面看到使用闩锁的代码(这是ns-3网络模拟器接口模拟的一部分)。 有些想法可能是尝试(JDK5 +)或(JDK7) 我可以测试代码,然后回
更准确地说,假设是一个类或接口,是的超类或超接口,中的方法声明重写或隐藏中的方法声明。然后: > 如果有一个throws子句提到任何检查的异常类型,那么必须有一个throws子句,否则将发生编译时错误。 对于的throws子句中列出的每个检查异常类型,相同的异常类或其一个超类型必须出现在的throws子句的擦除(§4.6)中;否则,将发生编译时错误。 如果的未擦除的throws子句不包含的thro
正如您所看到的,我正在方法和构造函数的子句中声明。但我不会在身体的任何地方抛出这个例外。因此,它应该是一个编译时错误,就像我们试图捕获不是从try块抛出的异常一样。但在这种情况下,它编译得很好。有人能解释一下这种行为背后的原因吗?
问题内容: 有谁知道是否有任何执行以下操作的闩锁实现: 有一种减少锁存器值的方法,或者如果该值为零则等待 具有等待锁存器值为零的方法 具有将数字添加到锁存器值的方法 问题答案: 除了从AQS开始,您可以使用下面的简单实现。它有些天真(它是同步的,而AQS是无锁算法),但是除非您希望在满足条件的情况下使用它,否则它可能已经足够好了。 注意:我尚未对其进行深入测试,但它的行为似乎与预期的一样: 输出:
我正在学习Java中的同步。我无法理解倒计时锁的确切机制。 CountDownLatch是否根据声明中给出的线程数“倒数锁存器”(等待线程数完成)? 这是我试图理解的代码: 在上面的例子中: ExecutorService(从线程池)生成7个线程。我的理解是闩锁应该等待6个线程(从0到5)的完成,定义如下: 但我得到的输出并不是每次都是恒定的。有时会等待6个线程完成,有时会等待7个线程完成,例如: