其中以下三个功能是更有效的;
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;
}
}
请用混凝土上可接受的逻辑回复。
前者是当更有效mServerDevice
是null
。 当mServerDevice
不null
都是差不多的。 与比较null
是两个32位整数,这是非常快的操作只是比较。 抛出异常是昂贵的,因为应该要创建新的对象和堆栈跟踪应该被填补。
特雷纳里操作... ? ... : ...
... ? ... : ...
是完全一样有效,因为if (...) ... else ...
说法,因为二者都转换为相同的字节。
那么,有没有必要的“落后”的比较(主要是从C缓缴其中一个错字不易被检查出来,如果你使用的是不高的编译或忽略警告) - 和条件操作使得事情变得更简单:
return mServerDevice != null ? mServerDevice.getName() : null;
要么:
return mServerDevice == null ? null : mServerDevice.getName();
这既是更具可读性和醒目相比更有效NullPointerException
。
在更复杂的情况下,只使用if
版本。 你永远不应该被抓NullPointerException
,除非你打电话到会抛出它在你无法避免方式马车库。 异常并不意味着以这种方式使用。 他们用于检测程序错误和异常的外部条件(如IO故障)。
与其他控制流结构相比例外是相对昂贵的。 但是,不要在其他方向借此太远:有些人避免例外,即使他们应该使用它们,由于被误导的愿望,以避免他们的成本。 如果使用得当 ,异常不应该是你的性能概况的显著部分:如果你发现自己正在服用大量的时间,那么无论是什么环境中的严重错误(例如,你永远尝试连接到一个数据库,你不必访问),或者你是滥用例外。
我绝对答案的其余部分一致。 不说同样的准确,我只能告诉你,我现在介绍的是已经3年左右写了一个相当大的商业源代码,我还没有看到使用任何语句try-catch
你所提到的方法的; 虽然有很多的检查null
;)
使用try-catch子句绝对不是一个更好的办法。
另外的try-catch在新的对象(除外)的实例化结果。 并且如果其他人提高了可读性。 因此我想说的是(N!= NULL)是快的情况下你有很多的情况下,其中n == NULL。 也是n!= null是超快的结构。
使用if-else
,可以在其中的情况。 抛出和捕获异常可以是昂贵的,应该用来处理错误情况(不是逻辑分支)。
无论性能,我宁愿如果其他形式。 假设mServerDevice不为空,但东西的getName()调用期间进入严重错误,它抛出一个NullPointerException。 基于异常的版本将不返回空值,而不记录错误。
文章来源: if(null check)-else vs try catch(NullPointerException) which is more efficient?