首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java catch vs instanceof

Java catch vs instanceof
EN

Stack Overflow用户
提问于 2017-04-06 07:48:13
回答 3查看 1.5K关注 0票数 1

我已经写了一个错误句柄如下所示。

Type#1

代码语言:javascript
复制
try{
  // Logic
} catch (SpecificException e){
  // Handle error-1
} catch (Exception e){
  if(e.getCause() instanceof SpecificException){
     // Handle error-1
  }
  // Handle error-2
}

但是,为了获得更好的清晰度和性能,我想改进代码如下所示

Type#2

代码语言:javascript
复制
try{
  // Logic
} catch (Exception e){
  if(e instanceof SpecificException || e.getCause() instanceof SpecificException){
     // Handle error-1
  }
  // Handle error-2
}

基于JVM方面,哪种类型更好?

在本例中,我需要处理泛型异常类型和特定异常类型,因此出现了处理问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-06 08:16:27

从性能的角度来看,不会有什么不同。

在Java中,catch块的顺序很重要,您可以捕获声明异常的子类。这意味着JVM不能真正使用任何映射或索引,必须在异常表中进行查找,因此逻辑类似于一系列if (e instanceof XXX)--这基本上是您的第二种方法。

可读性方面是基于意见的,所以我不会对此发表评论。

JavaWorld有一篇文章,它解释了在字节码/ JVM级别捕获过程中发生的事情。

票数 1
EN

Stack Overflow用户

发布于 2017-04-06 07:58:35

您的第一个和第二个选项不一样,因为即使对于//Handle error-2,也会调用instanceof SpecificException逻辑,或者您可能需要添加一个其他块来处理这个问题,如下所示:

代码语言:javascript
复制
try{
  // Logic
} catch (Exception e){
  if(e instanceof SpecificException || e.getCause() instanceof SpecificException){
     // Handle error-1
  } else {//else block for other exceptions?
    // Handle error-2
  }
}

正如您提到的,无论如何,如果您必须处理Exception (但是,一般来说,处理一般的Exception类型并不是很好的实践),那么第二个选项比在多个地方调用// Handle error-1//Handle error-2更好和更易读。

票数 0
EN

Stack Overflow用户

发布于 2017-04-06 07:59:07

为了避免重复Handle error-1代码块(即使它只是一行),我可能会选择选项2。

如果您经常使用此模式,我可能还会考虑尝试将其包装在实用程序方法中,类似于Guava的Throwables类中给出的方法(我不确定它是否已经包含了可以解决您的情况的内容)。

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

https://stackoverflow.com/questions/43248895

复制
相关文章

相似问题

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