if(null check)-else vs try catch(NullPointerException)哪个更有效?

时间:2013-03-02 08:20:29

标签: java performance performance-testing

以下三个功能中的哪一个更有效;

  public String getmConnectedDeviceName1() {
        if(null != mServerDevice) {
            return mServerDevice.getName();
        }
        else {
            return null;
        }
    }

  public String getmConnectedDeviceName2() {
        return mServerDevice == null ? null : mServerDevice.getName();
    }


  public String getmConnectedDeviceName3() {
        try{
            return mServerDevice.getName();
        }
        catch(NullPointerException e) {
            return null;
        }
    }

请以具体可接受的逻辑回复。

6 个答案:

答案 0 :(得分:27)

mServerDevicenull时,前者效率更高。如果mServerDevice不是null,则两者大致相同。与null的比较只是两个32位整数的比较,这是非常快的操作。抛出异常是很昂贵的,因为应该创建新对象并且应该填充堆栈跟踪。

Trenary运算符... ? ... : ...if (...) ... else ...语句完全一样有效,因为它们都被转换为相同的字节码。

答案 1 :(得分:19)

嗯,没有必要进行“向后”比较(主要是来自C的保留,如果您使用的是较差的编译器或忽略警告,则可能无法检测到拼写错误) - 并且条件运算符使事情更简单:

return mServerDevice != null ? mServerDevice.getName() : null;

或者:

    return mServerDevice == null ? null : mServerDevice.getName();

这比捕捉NullPointerException更有效更有效。

在更复杂的场景中,只需使用if版本即可。您应该从不捕捉NullPointerException,除非您正在调用一个以您无法避免的方式抛出它的错误库。例外并不意味着以这种方式使用。它们用于检测编程错误和异常外部条件(例如IO故障)。

与其他控制流构造相比,例外相对昂贵。但是,不要在另一个方向上走得太远:有些人甚至在他们应该使用它们时避免例外,因为他们错误地避免了他们的成本。当正确使用时,异常不应该是您的性能配置文件的重要部分:如果您发现他们花费了大量时间,那么您的环境中的任何一个都是严重错误的(例如,您'永远尝试连接到您无权访问的数据库)或者您正在滥用异常。

答案 2 :(得分:2)

我绝对同意其余的答案。为了不再说同样的话,我只会告诉你,现在我正在介绍一个已经编写了大约3年的相当大的商业源代码,我还没有看到任何使用try-catch方法的声明你提到过;虽然有很多要检查null;)

答案 3 :(得分:1)

使用try-catch子句绝对不是更好的方法。

此外,try-catch导致实例化新对象(异常)。  而且,如果否则提高可读性。 因此,如果您有很多n == null的情况,我会说(n!= null)更快。 n!= null也是超快构造。

答案 4 :(得分:0)

尽可能使用if-else。抛出和捕获异常可能很昂贵,应该用于处理错误情况(而不是逻辑分支)。

答案 5 :(得分:0)

无论表现如何,我都更喜欢if-else表格。假设mServerDevice不为null,但在getName()调用期间出现严重错误,并抛出NullPointerException。基于异常的版本将以静默方式返回null,而不记录错误。