繁体   English   中英

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

[英]if(null check)-else vs try catch(NullPointerException) which is more efficient?

以下哪三个功能更有效;

  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;
        }
    }

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

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

Trenary运营商... ? ... : ... ... ? ... : ...if (...) ... else ...语句完全一样有效,因为两者都被转换为相同的字节码。

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

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

要么:

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

这比捕获NullPointerException更具可读性效率。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM