这是一个简单的问题:
您如何看待每个指令使用 try catch 的代码?
void myfunction() {
try {
instruction1();
}
catch (ExceptionType1 e) {
// some code
}
try {
instruction2();
}
catch (ExceptionType2 e) {
// some code
}
try {
instruction3();
}
catch (ExceptionType3 e) {
// some code
}
try {
instruction4();
}
catch (ExceptionType4 e) {
// some code
}
// etc
}
我知道这太可怕了,但我想知道这是否会降低性能。
答案 0 :(得分:9)
尝试这样的事情:(我知道这不能回答你的问题,但它更清洁了)
void myfunction() {
try {
instruction1();
instruction2();
instruction3();
instruction4();
}
catch (ExceptionType1 e) {
// some code
}
catch (ExceptionType2 e) {
// some code
}
catch (ExceptionType3 e) {
// some code
}
catch (ExceptionType4 e) {
// some code
}
// etc
}
答案 1 :(得分:6)
它不会降低性能(当然也不会显着),但确实看起来很糟糕。
记住黄金法则:可读代码通常是更快的代码。首先生成可读代码,只有在证明速度太慢时才更改它。
将try-catch块分组为原始代码的逻辑块(例如,一个用于打开流并从中读取数据,一个用于之后完成的所有处理),维护开发人员将感谢您。
您还应该考虑,如果捕获异常的第一个catch块没有突然结束(即,在正常流程中继续执行),后续指令可能会抛出其他异常,这些异常依赖于之前的成功完成,哪些都是虚假的,他们可以减慢您的代码。
答案 2 :(得分:5)
不,这可能不会降低性能(但是,一如既往,您必须对其进行测试)。编译成字节码时,Java异常处理程序将更改为字节码偏移范围和关联处理程序地址的表。 catch处理程序通常在代码的主线之外编译,因此不会影响“正常”的非异常执行。
可以在Java虚拟机规范section 7.12 Throwing and Handling Exceptions中找到更多信息。本节还提供了如何将各种代码构造编译为字节码的示例。
答案 3 :(得分:2)
如果抛出异常,在性能方面使用过量的try-catch
可能会开始变得昂贵。如果没有这么多的已检查异常或者让所有ExceptionTypes都扩展了一个常见的Exception基类,你会更好。通过这种方式,您可以使用单个try catch,它更易于阅读并具有更好的性能。
答案 4 :(得分:1)
从this answer可以看出,除非引发错误,否则性能最低。