我想咨询有关JDK代码异常处理的信息,
第120行的ScriptEngineManager中有ServiceConfigurationError
的未使用的次要捕获,据我了解不能抛出
try { while (itr.hasNext()) { try { ScriptEngineFactory fact = (ScriptEngineFactory) itr.next(); facList.add(fact); } catch (ServiceConfigurationError err) { System.err.println("ScriptEngineManager providers.next(): " + err.getMessage()); if (DEBUG) { err.printStackTrace(); } // one factory failed, but check other factories... continue; } } } catch (ServiceConfigurationError err) { System.err.println("ScriptEngineManager providers.hasNext(): " + err.getMessage());
有没有必要第二个陷阱的原因?看来它只对while (itr.hasNext())
有效,不会引发任何异常
或者说,要确保方法在任何情况下都不会抛出异常只是过于谨慎
// do not throw any exception here.
实际上,java允许您复制此类try-catch而不会出现任何错误/警告:
try {
try {
ScriptEngineFactory fact = itr.next();
engineSpis.add(fact);
} catch (ServiceConfigurationError err) {
err.printStackTrace();
}
} catch (ServiceConfigurationError err) {
err.printStackTrace();
}
如果我以相同的尝试连接渔获物,则会出现编译错误
Unreachable catch block for ServiceConfigurationError. It is already handled by the catch block for ServiceConfigurationError
答案 0 :(得分:1)
轻微误解:第二个陷阱不仅覆盖while循环。它还将注意从第一个catch块中引发的此类异常。
但是您是正确的:该catch块以及循环“ header”不应引发此类异常。只是简单地迭代一个迭代器就需要这种方式的“保护”,这似乎很奇怪。
因此:当该方法中存在其他代码时,这可能是剩余的。否则就太过分了。或更糟糕的是,我们看不到的代码(创建该迭代器)实际上会引发这种错误。至少可以说,这是一个奇怪且非常奇怪的设计。