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

2022-09-02 19:24:10

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

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

请用具体的可接受的逻辑来回答。


答案 1

前者在 是 时效率要高得多。当不是两者大致相同。比较只是比较两个32位整数,这是非常快速的操作。引发异常代价高昂,因为应该创建新对象并填充堆栈跟踪。mServerDevicenullmServerDevicenullnull

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


答案 2

好吧,没有必要进行“向后”比较(主要是C的遗留物,如果你使用的是糟糕的编译器或忽略的警告,拼写错误可能会被发现) - 条件运算符使事情变得更简单:

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

艺术

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

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

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

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


推荐