ScriptEngineManager 格外谨慎的异常处理

想咨询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


慕慕森
浏览 118回答 1
1回答

阿波罗的战车

小误解:第二个 catch 不仅涵盖 while 循环。它还会处理从第一个 catch 块中抛出的此类异常。但你是对的:那个 catch 块,以及循环“header”不应该抛出这样的异常。简单地迭代迭代器需要以这种方式进行“保护”,这似乎很奇怪。因此:当该方法中存在其他代码时,这可能是剩余的。或者它是过度的。或者最坏的情况,我们看不到的代码(创建迭代器)实际上会抛出那种错误。如前所述,至少可以说,这将是一个奇怪且非常奇怪的设计。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java