Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java try-catch块的放置是否会影响性能?_Java_Performance_Try Catch - Fatal编程技术网

Java try-catch块的放置是否会影响性能?

Java try-catch块的放置是否会影响性能?,java,performance,try-catch,Java,Performance,Try Catch,try-catch块的放置是否会影响性能 示例1:在while循环中尝试catch块 while (true) { try { // ... read from a file } catch (EOFException e) { break; } } try { while (true) { // ... read from a file } } catch (EOFException e) {

try-catch块的放置是否会影响性能

示例1:在while循环中尝试catch块

while (true) {
    try {
        // ... read from a file
    } catch (EOFException e) {
        break;
    }
}
try {
    while (true) {
        // ... read from a file
    } 
} catch (EOFException e) {
    // :P
}
示例2:环绕while循环的try catch块

while (true) {
    try {
        // ... read from a file
    } catch (EOFException e) {
        break;
    }
}
try {
    while (true) {
        // ... read from a file
    } 
} catch (EOFException e) {
    // :P
}

从逻辑上讲,这两个示例是等效的,但我应该选择哪一个?

try-catch产生的任何开销可能都可以忽略不计,但第一种情况更吸引我注意的是它具有误导性:您捕获异常,只是为了中止循环。我会选择解决方案2,因为它与目的一致。这样可以避免任何开销。

你能从外面休息一下吗?我不认为你的假设,即2是等价的是真的

我的直觉告诉我,圈外的尝试/捕捉更好。如果写try/catch会对字节码产生影响,那么创建的代码越少越好。如果没有影响,除非发生异常,那么它就无关紧要了。我看不出在任何情况下,把try/catch放在里面会更好

我可能错了…

这比我能给出的答案要好得多。简而言之,它们只在抛出异常时检查的表中添加一个条目,因此除非抛出异常,否则不会影响性能。如果可以的话,最好把它放在任何能让它恢复的地方。如果没有,无论哪里有用或有意义。
尽管循环外有break,但我认为第二个示例无论如何都是无效的。

第二个示例(围绕代码的try-catch块)更快更清晰。

try-catch的放置对应用程序的性能没有任何影响。即使是这样,它也将是完全可以忽略的,这不是你想要引导你的能量的地方。首先根据需要实施,然后优化。不要进行微优化。

这两个代码示例并不相等。是的,在第二种情况下,您当然不希望
中断要么你的程序无法编译,要么你将跳出错误的循环。正如其他人所指出的,代码示例并不等效。如果你不在一个循环中,你就不能真正从中刹车。不管怎样,是什么阻止了您对其进行基准测试?这是一个相当简单的代码基准测试。
@krock:
我一直在等待有人这么说;在高层,它在我的代码中是等效的。稍后我将发布一个完整的代码示例,但希望您能理解这个问题。
@all:
第二次中断是复制/粘贴的错误。第二次中断是复制/粘贴的错误。第二次中断是复制/粘贴的错误。我没有说这方面的任何内容。我知道这是一个错误,并忽略了它,因为你已经清楚地说明了你的意图。第二次中断是复制/粘贴的错误。