ScriptEngineManager特别谨慎的异常处理

时间:2019-05-26 12:49:26

标签: java exception try-catch scriptengine

我想咨询有关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

1 个答案:

答案 0 :(得分:1)

轻微误解:第二个陷阱不仅覆盖while循环。它还将注意从第一个catch块中引发的此类异常。

但是您是正确的:该catch块以及循环“ header”不应引发此类异常。只是简单地迭代一个迭代器就需要这种方式的“保护”,这似乎很奇怪。

因此:当该方法中存在其他代码时,这可能是剩余的。否则就太过分了。或更糟糕的是,我们看不到的代码(创建该迭代器)实际上会引发这种错误。至少可以说,这是一个奇怪且非常奇怪的设计。