【问题标题】:Exception with try-catch and loop in JavaJava中的try-catch和循环异常
【发布时间】:2011-06-12 19:07:55
【问题描述】:

在 Java 中,有什么区别(就性能而言):

for (int i = 0; i < count; i++) {
    try {
        // code that throws Exception
    } catch (Exception e) {
        e.printStackTrace();
    }
}

try {
    for (int i = 0; i < count; i++) {
        // code that throws Exception
    }
} catch (Exception e) {
    e.printStackTrace();
}

【问题讨论】:

    标签: java exception for-loop


    【解决方案1】:

    在您的第一个版本中,如果遇到异常则循环继续,在第二个版本中,循环在 catch 块之后继续。这就是那些代码sn-ps最重要的区别。

    【讨论】:

    • 谢谢。如果我将 try-catch 放在循环中,是否会降低性能?
    • @Martin:这些循环做不同的事情。围绕执行不同操作的代码的性能讨论毫无意义。如果你真的真的真的真的真的真的真的很想比较执行不同操作的代码的性能,你可以衡量它。
    • @Martin08 如果它的答案接受它,以便其他阅读本文的人可以学习。
    【解决方案2】:

    主要区别在于,在第一个sn-p代码中,即使try块抛出异常并被捕获,for循环的执行也会继续。在第二个 sn-p 中,如果抛出异常,则退出 for 循环。这是因为整个循环都在 try 块内。

    【讨论】:

      【解决方案3】:

      由于您询问了两个版本代码的性能,我想起了 Praxis 23 中推荐的“Practical Java”(Addison-Wesley 2000):将 try/catch 块放在循环之外 .

      原因涉及在关闭 JIT 编译器的情况下在 JVM 上运行代码。在这种情况下,缺乏运行时 JIT 优化会导致操作码中出现额外的分支,从而导致性能下降。

      您可以在此处阅读 2014 年的 JIT 文档:http://www.oracle.com/technetwork/articles/java/architect-evans-pt1-2266278.html

      【讨论】:

        【解决方案4】:

        您可以同时使用这两种方法,但这完全取决于您希望它做什么。如果您想在循环完成一次后继续执行,那么您可以采用第一种方式。如果你想捕获一个异常然后停止执行循环然后你做第二个。性能方面,这一切都取决于你想用它做什么。

        【讨论】:

          【解决方案5】:

          除了你的逻辑与持续的不同之外。

          之间没有明显区别
          try {
          lots of stuff which might not throw any exception
          something that throws exception
          } catch (Exception e) {
          }
          

          lots of stuff which might not throw any exception
          try {
          something that throws exception
          } catch (Exception e) {
          }
          

          【讨论】:

            【解决方案6】:

            不,我很确定这里的性能绝对没有区别(忽略关于循环的明显事实)。在这两种情况下,您只在异常表中创建了一个条目 - 只有 PC 值(即异常有效的范围内)会有点不同。

            即如果您假设以下是异常表,那么唯一会改变的是 x、y 和 z 值..

            Exception table:
               from to target type
                 x y z <Class java.lang.Exception>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多