Java尝试捕获块

Java尝试捕获块,java,try-catch,Java,Try Catch,这里有一个简单的问题: 对于每一条指令都使用try-catch的代码,您怎么看 void myfunction() { try { instruction1(); } catch (ExceptionType1 e) { // some code } try { instruction2(); } catch (ExceptionType2 e) { // some code

这里有一个简单的问题:

对于每一条指令都使用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
}

我知道这很可怕,但我想知道这是否会降低性能。

如果抛出异常,使用过多的
try-catch
可能会导致性能降低。最好不要有这么多已检查的异常,或者让所有ExceptionTypes扩展公共异常基类。通过这种方式,您可以获得一个简单易读且性能更好的try-catch。

它不会降低性能(当然不会明显降低),但确实看起来很糟糕

记住黄金法则:可读代码通常是更快的代码。首先生成可读的代码,只有在证明速度太慢时才进行更改

将您的try-catch块分组到原始代码的逻辑块中(例如,一个用于打开流并从中读取数据,一个用于随后完成的所有处理),您的维护开发人员将为此感谢您


您还应该考虑,如果第一个catch块捕获异常不会突然终止(即,在正常流中继续执行),后续的指令可能会抛出额外的异常,这些指令依赖于先前的成功完成,这两个指令都是虚假的,它们可以使代码慢下来。这可能不会降低性能(但是,像往常一样,您必须测试它)。当编译成字节码时,Java异常处理程序将更改为字节码偏移量范围和相关处理程序地址的表。捕获处理程序通常在代码的主线之外编译,因此不会影响“正常”非异常执行

更多信息可以在Java虚拟机规范中找到。本节还提供了如何将各种代码构造编译成字节码的示例。

正如您从中看到的,除非抛出错误,否则性能将降至最低。

尝试类似的方法:(我知道这不能回答您的问题,但它更干净)


如果您想知道这是否会降低性能,请测量它!有太多的因素无法给出一个明确的答案(您的JVM、硬件平台、那些
instructionX
调用有多耗时、是否会引发异常)。性能下降的可能重复性很小,但由于引入了多个执行路径,您可能会付出沉重的代价。如果抛出异常1并由您处理,则可能会抛出异常2。它实际上取决于您的业务逻辑(如果抛出或未抛出任何异常,执行是否会中断)。但是性能不是代码的问题。您的代码示例具有误导性。。。您称之为“指令”的内容在编写时似乎总是一个方法调用。你的意思是“你认为在每个方法调用中使用try/catch的代码怎么样?”因为我肯定会对包装指令说更多的话,比如int a=42;在一次尝试中;)这永远不会造成性能的明显下降
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
}