在Java语言中,使用try/catch块,而不是使用if块(假设附带的代码没有这样的要求),会有任何开销吗?
例如,以以下两个简单的字符串"safe trim“方法实现为例:
public String tryTrim(String raw) {
try {
return raw.trim();
} catch (Exception e) {
}
return null;
}
public String ifTrim(String raw) {
if (raw == null) {
return null;
}
return raw.trim();
}
如果raw
输入只有很少的null
,那么这两种方法之间是否存在性能差异?
此外,使用tryTrim()
方法来简化代码布局是一种很好的编程模式吗?尤其是当可以通过将代码封装在一个/catch块中来避免许多if块检查罕见错误的情况时。
例如,常见的情况是使用N parameters
的方法,该方法在开始时使用M <= N
,如果任何这样的参数“无效”(例如,null或空字符串),则会迅速且确定地失败,而不会影响代码的其余部分。
在这种情况下,不必编写k * M
if块(其中k
是每个参数的平均检查次数,例如空字符串或空字符串的k = 2
),try/catch块将显著缩短代码,并且可以使用1-2行注释来显式地记录“非传统”逻辑。
这样的模式还将加速该方法,特别是当错误条件很少出现时,并且它将在不损害程序安全性的情况下这样做(假设错误条件是“正常的”,例如在字符串处理方法中,其中null或空值是可接受的,尽管很少出现)。
发布于 2011-12-24 08:18:07
我知道你问的是性能开销,但你真的不应该交替使用try
/catch
和if
。
try
/catch
是针对那些您无法控制且不在正常程序流中的错误。例如,尝试写入文件时文件系统已满?这种情况通常应该使用try
/catch
来处理。
if
语句应该是正常的流程和普通的错误检查。那么,例如,用户无法填充所需的输入字段?使用if
,而不是try
/catch
。
在我看来,您的示例代码强烈表明,正确的方法是使用if
语句,而不是try
/catch
。
为了回答你的问题,我猜测try
/catch
通常比if
有更多的开销。要确定这一点,请使用Java分析器,找出您所关心的特定代码。答案可能会因情况不同而有所不同。
发布于 2011-12-24 08:18:21
使用第二个版本。当有其他替代方案可用时,永远不要使用控制流的异常,因为这不是它们存在的目的。例外是针对特殊情况的。
在这个话题上,不要在这里抓住Exception
,尤其是不要吞下它。在您的例子中,您会期望得到一个NullPointerException
。如果你要抓到什么东西,那就是你会抓到的东西(但回到第一段,do do )。当您捕获(并吞下!) Exception
时,您是在说“无论发生什么错误,我都可以处理它。我不在乎它是什么。”您的程序可能处于不可撤销的状态!只捕获您准备处理的内容,让其他所有内容都传播到一个可以处理它的层,即使该层是最上层,它所做的所有事情就是记录异常,然后按下弹出开关。
发布于 2011-12-24 08:18:54
否则,抛出和捕获异常很快(尽管if
可能更快),但最慢的是创建异常的堆栈跟踪,因为它需要遍历所有当前堆栈。(一般来说,为控制流使用异常是不好的,但是当确实需要这样做并且异常必须很快时,可以通过覆盖Throwable.fillInStackTrace()
方法跳过构建堆栈跟踪,或者保存一个异常实例并重复抛出它,而不是总是创建一个新的异常实例。)
https://stackoverflow.com/questions/8621762
复制相似问题