以下三个功能中的哪一个更有效;
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;
}
}
请以具体可接受的逻辑回复。
答案 0 :(得分:27)
当mServerDevice
为null
时,前者效率更高。如果mServerDevice
不是null
,则两者大致相同。与null
的比较只是两个32位整数的比较,这是非常快的操作。抛出异常是很昂贵的,因为应该创建新对象并且应该填充堆栈跟踪。
Trenary运算符... ? ... : ...
与if (...) ... else ...
语句完全一样有效,因为它们都被转换为相同的字节码。
答案 1 :(得分:19)
嗯,没有必要进行“向后”比较(主要是来自C的保留,如果您使用的是较差的编译器或忽略警告,则可能无法检测到拼写错误) - 并且条件运算符使事情更简单:
return mServerDevice != null ? mServerDevice.getName() : null;
或者:
return mServerDevice == null ? null : mServerDevice.getName();
这比捕捉NullPointerException
更有效和更有效。
在更复杂的场景中,只需使用if
版本即可。您应该从不捕捉NullPointerException
,除非您正在调用一个以您无法避免的方式抛出它的错误库。例外并不意味着以这种方式使用。它们用于检测编程错误和异常外部条件(例如IO故障)。
与其他控制流构造相比,例外相对昂贵。但是,不要在另一个方向上走得太远:有些人甚至在他们应该使用它们时避免例外,因为他们错误地避免了他们的成本。当正确使用时,异常不应该是您的性能配置文件的重要部分:如果您发现他们花费了大量时间,那么您的环境中的任何一个都是严重错误的(例如,您'永远尝试连接到您无权访问的数据库)或者您正在滥用异常。
答案 2 :(得分:2)
我绝对同意其余的答案。为了不再说同样的话,我只会告诉你,现在我正在介绍一个已经编写了大约3年的相当大的商业源代码,我还没有看到任何使用try-catch
方法的声明你提到过;虽然有很多要检查null
;)
答案 3 :(得分:1)
使用try-catch子句绝对不是更好的方法。
此外,try-catch导致实例化新对象(异常)。 而且,如果否则提高可读性。 因此,如果您有很多n == null的情况,我会说(n!= null)更快。 n!= null也是超快构造。
答案 4 :(得分:0)
尽可能使用if-else
。抛出和捕获异常可能很昂贵,应该用于处理错误情况(而不是逻辑分支)。
答案 5 :(得分:0)
无论表现如何,我都更喜欢if-else表格。假设mServerDevice不为null,但在getName()调用期间出现严重错误,并抛出NullPointerException。基于异常的版本将以静默方式返回null,而不记录错误。