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】:当mServerDevice
是null
时,前者效率更高。当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) 哪个更有效?的主要内容,如果未能解决你的问题,请参考以下文章
python中try。。。 except应该怎么用?与if。。。else有啥差别? print与return又有何差别?