【问题标题】:Java try catch blocksJava try catch 块
【发布时间】:2011-03-01 18:23:23
【问题描述】:

这里有一个简单的问题:

您如何看待每条指令都使用 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
}

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

【问题讨论】:

  • 如果您想知道这是否会降低性能,请测量它!有太多因素无法给出明确的答案(您的 JVM、硬件平台、instructionX 调用的耗时程度、是否真的抛出异常)。
  • 性能下降很小,但您可能会付出沉重的代价,因为您引入了多个执行路径。如果异常 1 被抛出并且你处理它,那么异常 2 可能会被抛出。它实际上取决于您的业务逻辑(如果抛出任何异常,执行是否应该中断)。但性能不是您的代码的问题。
  • 您的代码示例具有误导性......您所说的“指令”被写成好像它总是一个方法调用。您的意思是 “您如何看待在每个方法调用周围使用 try/catch 的代码?” 因为对于像 int a = 这样的包装指令,我肯定还有更多话要说42;try/catch ;)
  • 这不会导致性能明显下降

标签: java try-catch


【解决方案1】:

试试这样的:(我知道这不能回答你的问题,但它更干净)

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
}

【讨论】:

    【解决方案2】:

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

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

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

    您还应该考虑,如果您第一个捕获异常的 catch 块没有突然结束(也就是说,执行在正常流程中继续),则依赖于先前成功完成的后续指令可能会引发其他异常,它们都是虚假的,它们会减慢您的代码速度。

    【讨论】:

      【解决方案3】:

      不,这可能不会降低性能(但一如既往,您必须对其进行测试)。当编译成字节码时,Java 异常处理程序会变成一个字节码偏移范围和相关处理程序地址的表。 catch 处理程序通常在代码主线之外编译,因此不会影响“正常”的非异常执行。

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

      【讨论】:

        【解决方案4】:

        如果抛出异常,使用过多的try-catch 可能会导致性能下降。最好不要有这么多已检查的异常,或者让所有 ExceptionTypes 扩展一个通用的 Exception 基类。这样一来,您就可以拥有一个更容易阅读且性能更好的 try catch。

        【讨论】:

          【解决方案5】:

          正如您在this answer 中看到的那样,除非抛出错误,否则性能会受到影响。

          【讨论】:

            猜你喜欢
            • 2016-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-01
            • 2015-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多