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

以下哪三项function更有效;

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位整数,这是非常快的操作。 抛出exception是很昂贵的,因为应该创建新对象并且应该填充堆栈跟踪。

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

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

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

要么:

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

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

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

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

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

使用try-catch子句肯定不是更好的方法。

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

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

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