我想咨询一下JDK代码异常处理,
在 ScriptEngineManager从第 120 行开始,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
最佳答案
小误解:第二个 catch 不仅仅覆盖 while 循环。它还会处理从第一个 catch block 中抛出的此类异常。
但是你是对的:catch block 以及循环“ header ”不应该抛出这样的异常。简单地迭代迭代器需要以这种方式“保护”,这似乎很奇怪。
因此:也许这是该方法中存在其他代码时的剩余部分。或者是做得太过分了。或者最坏的情况是,我们看不到的代码(创建该迭代器)实际上可能会抛出此类错误。如上所述,至少可以说,这是一个奇怪且非常奇怪的设计。
关于java - ScriptEngineManager 特别谨慎的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56313658/