Java try/catch 性能,是否建议将 try 子句中的内容保持在最低限度?

2022-09-01 08:48:09

考虑到你有这样的代码:

doSomething() // this method may throw a checked a exception
//do some assignements calculations
doAnotherThing() //this method may also throw the same type of checked exception
//more calls to methods and calculations, all throwing the same kind of exceptions.

现在我知道了,实际上在构造异常(特别是展开堆栈)时会受到性能影响。我还阅读了几篇文章,指出在进入尝试/捕获块时性能受到轻微影响,但似乎没有一篇文章得出任何结论。

我的问题是,是否建议将 try catch 内的行保持在最低限度?,即只在 try 子句中包含可以实际抛出您正在捕获的异常的行。try 子句中的代码是否运行速度较慢或导致任何性能下降?

但更重要的是,考虑这样做的最佳实践/更具可读性的解决方案是什么:

try {
    doSomething() // this method may throw a checked a exception
//do some assignements calculations
doAnotherThing() //this method may also throw the same type of checked exception
//more calls to methods and calculations, all throwing the same kind of exceptions.
}
catch (MyCheckedException e) {
   //handle it
}

或:

try {
    doSomething() // this method may throw a checked a exception
}
catch (MyCheckedException e) {
   //Store my exception in a Map (this is all running in a loop and I want it to   continue running, but I also want to know which loops didn't complete and why)
   continue;     
} 
 //do some assignements calculations
try {
    doAnotherThing() // this method may throw a checked a exception
}
catch (MyCheckedException e) {
    //Store my exception in a Map (this is all running in a loop and I want it to   continue running, but I also want to know which loops didn't complete and why)
   continue;
} 

这是考虑到您将以完全相同的方式处理所有这些已检查的异常。


答案 1

是否建议将尝试捕获内的线保持在最低限度?

不。无法想象你怎么会认为一个块或任何块的长度会对性能产生任何影响。try

try 子句中的代码是否运行速度较慢或导致任何性能下降?

不。

如您所见,异常仅在引发时产生性能开销。

如果您担心“尝试”性能,那么要做的肯定是将内部代码保持在最大水平吗?


答案 2

在你这里的例子中,真正的性能影响是如果 doSomething() 和 doAnotherThing() 都抛出异常。进入 try-block 的速度很快,直到它引发异常。

这真的取决于你的情况是什么。如果你需要在MyCheckedException被抛出任何一种方式时做同样的事情,我认为将它们放在同一个try块中既更具可读性又更高性能,但是如果你需要以不同的方式处理两种不同的情况,那么将它们分开当然更有意义。

编辑:我读了你的评论的结尾,你假设以相同的方式处理两者,在这种情况下,我会把它们都放在同一个尝试块中。


推荐