反对抛出异常的最佳实践

时间:2009-09-15 15:25:11

标签: java

在Java中:哪个是性能最高的代码?为什么?

if (x==1) {
    ....
} else if (x==2) {
    ....
} else if (x==3) {
    ....
} else if (x==4) {
    ....
}
... rest code here...

or 

try {
    if (x==1) {
        ... 
        throw MyException(1);
    }
    if (x==2) {
        ... 
        throw MyException(2);
    }
    if (x==3) {
        ... 
        throw MyException(3);
    }
    if (x==4) {
        ... 
        throw MyException(4);
    }
} catch(MyException MEx) {
    ... rest code here ...
}

非常感谢!

7 个答案:

答案 0 :(得分:13)

在您的示例中,您正在使用流控制的异常。例外是昂贵的操作(或者,至少比ifelse-if块更昂贵)。例外情况仅适用于特殊情况。

此外,使用else if将确保在找到匹配的案例后立即停止检查。仅使用if将始终检查所有这些,并且将执行任何匹配的情况。如果你有很多案例并且最常见的情况是按照最常见的情况排序,那么使用if-else-if会更好。

答案 1 :(得分:4)

其他人回答了你的问题,但我想我会指出......

仅仅因为Java没有“goto”命令(已实现),并不意味着你应该使用Exceptions来模拟它们。

答案 2 :(得分:2)

第二个版本不仅性能更差,而且读者也很困惑,而不是如何使用异常。

答案 3 :(得分:0)

目前,两者无法比较。为什么在第二个示例中将“其余代码”放在异常处理程序中,而在第一个示例中没有提到该异常?如果肯定会抛出该异常,那么第一个中的“其余代码”将永远不会被执行。

答案 4 :(得分:0)

使用异常时,您可以获得更高的性能。但是异常是一种特殊的结构,不能与控制流结构混淆,例如if-else

答案 5 :(得分:0)

不是说我是开关语句的忠实粉丝,但这不是教科书的情况吗?

    switch (x) {
    case 1:

        break;
    case 2:

        break;
    default:
        break;
    }
...

答案 6 :(得分:0)

  

...哪个是性能最高的代码

if / elseif构造。

  

为什么?

因为后者涉及创建MyException类型的对象(内部可以填充堆栈跟踪,为对象分配内存,使用异常代码赋值变量)

虽然差异可能不会乍看起来最差,但绝对是例外情况的不利用。

我可以给你(或尝试)一个关于它的解释,但更好的是你从这个问题的权威人士那里读到它:

有效的Java项目: Use exception for exceptional conditions

Joshua Bloch。