首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java if与try/catch开销

Java if与try/catch开销
EN

Stack Overflow用户
提问于 2011-12-24 08:13:27
回答 4查看 39.4K关注 0票数 56

在Java语言中,使用try/catch块,而不是使用if块(假设附带的代码没有这样的要求),会有任何开销吗?

例如,以以下两个简单的字符串"safe trim“方法实现为例:

代码语言:javascript
复制
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或空值是可接受的,尽管很少出现)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-24 08:18:07

我知道你问的是性能开销,但你真的不应该交替使用try/catchif

try/catch是针对那些您无法控制且不在正常程序流中的错误。例如,尝试写入文件时文件系统已满?这种情况通常应该使用try/catch来处理。

if语句应该是正常的流程和普通的错误检查。那么,例如,用户无法填充所需的输入字段?使用if,而不是try/catch

在我看来,您的示例代码强烈表明,正确的方法是使用if语句,而不是try/catch

为了回答你的问题,我猜测try/catch通常比if有更多的开销。要确定这一点,请使用Java分析器,找出您所关心的特定代码。答案可能会因情况不同而有所不同。

票数 66
EN

Stack Overflow用户

发布于 2011-12-24 08:18:21

使用第二个版本。当有其他替代方案可用时,永远不要使用控制流的异常,因为这不是它们存在的目的。例外是针对特殊情况的。

在这个话题上,不要在这里抓住Exception,尤其是不要吞下它。在您的例子中,您会期望得到一个NullPointerException。如果你要抓到什么东西,那就是你会抓到的东西(但回到第一段,do do )。当您捕获(并吞下!) Exception时,您是在说“无论发生什么错误,我都可以处理它。我不在乎它是什么。”您的程序可能处于不可撤销的状态!只捕获您准备处理的内容,让其他所有内容都传播到一个可以处理它的层,即使该层是最上层,它所做的所有事情就是记录异常,然后按下弹出开关。

票数 11
EN

Stack Overflow用户

发布于 2011-12-24 08:18:54

否则,抛出和捕获异常很快(尽管if可能更快),但最慢的是创建异常的堆栈跟踪,因为它需要遍历所有当前堆栈。(一般来说,为控制流使用异常是不好的,但是当确实需要这样做并且异常必须很快时,可以通过覆盖Throwable.fillInStackTrace()方法跳过构建堆栈跟踪,或者保存一个异常实例并重复抛出它,而不是总是创建一个新的异常实例。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8621762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档