如果(空检查)-else VS尝试catch(NullPointerException异常),这是更

2019-07-20 19:43发布

其中以下三个功能是更有效的;

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

请用混凝土上可接受的逻辑回复。

Answer 1:

前者是当更有效mServerDevicenull 。 当mServerDevicenull都是差不多的。 与比较null是两个32位整数,这是非常快的操作只是比较。 抛出异常是昂贵的,因为应该要创建新的对象和堆栈跟踪应该被填补。

特雷纳里操作... ? ... : ... ... ? ... : ...是完全一样有效,因为if (...) ... else ...说法,因为二者都转换为相同的字节。



Answer 2:

那么,有没有必要的“落后”的比较(主要是从C缓缴其中一个错字不易被检查出来,如果你使用的是不高的编译或忽略警告) - 和条件操作使得事情变得更简单:

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

要么:

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

这既是更具可读性醒目相比更有效NullPointerException

在更复杂的情况下,只使用if版本。 你永远不应该被抓NullPointerException ,除非你打电话到会抛出它在你无法避免方式马车库。 异常并不意味着以这种方式使用。 他们用于检测程序错误和异常的外部条件(如IO故障)。

与其他控制流结构相比例外是相对昂贵的。 但是,不要在其他方向借此太远:有些人避免例外,即使他们应该使用它们,由于被误导的愿望,以避免他们的成本。 如果使用得当 ,异常不应该是你的性能概况的显著部分:如果你发现自己正在服用大量的时间,那么无论是什么环境中的严重错误(例如,你永远尝试连接到一个数据库,你不必访问),或者你是滥用例外。



Answer 3:

我绝对答案的其余部分一致。 不说同样的准确,我只能告诉你,我现在介绍的是已经3年左右写了一个相当大的商业源代码,我还没有看到使用任何语句try-catch你所提到的方法的; 虽然有很多的检查null ;)



Answer 4:

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

另外的try-catch在新的对象(除外)的实例化结果。 并且如果其他人提高了可读性。 因此我想说的是(N!= NULL)是快的情况下你有很多的情况下,其中n == NULL。 也是n!= null是超快的结构。



Answer 5:

使用if-else ,可以在其中的情况。 抛出和捕获异常可以是昂贵的,应该用来处理错误情况(不是逻辑分支)。



Answer 6:

无论性能,我宁愿如果其他形式。 假设mServerDevice不为空,但东西的getName()调用期间进入严重错误,它抛出一个NullPointerException。 基于异常的版本将不返回空值,而不记录错误。



文章来源: if(null check)-else vs try catch(NullPointerException) which is more efficient?