繁体   English   中英

try-catch 和循环在 Java 中的例外

[英]Exception with try-catch and loop in Java

在 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();
}

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

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

由于您询问了两个版本代码的性能,我想起了 Praxis 23 中推荐的“Practical Java”(Addison-Wesley 2000): Place try/catch blocks outside of loops

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

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

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

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

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

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

除了你的逻辑与持续的差异之外。 之间没有明显区别

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) {
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM