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

Posted

技术标签:

【中文标题】if(null check)-else 与 try catch(NullPointerException) 哪个更有效?【英文标题】:if(null check)-else vs try catch(NullPointerException) which is more efficient? 【发布时间】:2013-02-16 19:38:00 【问题描述】:

以下三个功能哪个更高效;

  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;
        
    

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

【问题讨论】:

没有可应用的逻辑。捕获异常来测试空值是完全错误的。 @Simon:问题不在于对错。这是关于效率的。仔细阅读问题。 好的。因此,正如所提供的答案所解释的那样,故意捕获异常是低效的。不管怎样,在几乎所有情况下,正确的练习都会压倒效率。在这种情况下,与大多数其他情况一样,正确的做法也是最有效的。 【参考方案1】:

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

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

或者:

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

这比捕获NullPointerException 更具可读性

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

与其他控制流构造相比,异常相对代价高昂。但是,不要在另一个方向上走得太远:有些人即使在应该使用异常时也避免异常,因为他们误入歧途地希望避免它们的成本。当适当地使用时,异常不应成为您的性能配置文件的重要组成部分:如果您发现它们占用了您很多时间,那么您的环境中可能存在严重错误(例如,您不断尝试连接到您无权访问的数据库)或者您正在滥用异常。

【讨论】:

@user000001:确实是的 - 或者颠倒操作数顺序。 @shriduttkothari:“这比捕获 NullPointerException 更具可读性和效率”的哪一部分没有说哪个更有效?请注意,您应该非常很少以牺牲可读性为代价进行微优化 - 当您这样做时,您应该已经进行了测试,以便您自己轻松判断。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

三元运算符... ? ... : ...if (...) ... else ... 语句一样有效,因为两者都被转换为相同的字节码。

【讨论】:

【参考方案4】:

不管性能如何,我更喜欢 if-else 形式。假设 mServerDevice 不为 null,但在 getName() 调用期间出现严重错误,并引发 NullPointerException。基于异常的版本将静默返回 null,而不记录错误。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

在可能的情况下使用if-else。抛出和捕获异常可能代价高昂,应该用于处理错误情况(不适用于逻辑分支)。

【讨论】:

以上是关于if(null check)-else 与 try catch(NullPointerException) 哪个更有效?的主要内容,如果未能解决你的问题,请参考以下文章

Java推荐用if else还是用try catch?

python中try。。。 except应该怎么用?与if。。。else有啥差别? print与return又有何差别?

JavaScript里的try..catch和if...else有何区别啊

Check website url

三网运营商大数据

使用 try/except 或 if else 创建和验证目录? [复制]