为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 IntelliJ 在我没有捕获预期的异常类型时显示编译错误?

为什么 IntelliJ 在我没有捕获预期的异常类型时显示编译错误?

牧羊人nacy 2022-09-07 21:27:27
在IntelliJ中,我正在研究一些从Google Cloud DataStore检索实体的代码,使用如下块:trycatch    try {        T dataAccessObject = class.newInstance();        entity = datastore.get(KeyFactory.createKey(dataAccessObject.GetEntityName().toString(), id));        dataModel = (T)dataAccessObject.ToModel(entity);        return dataModel;    } catch (EntityNotFoundException e) {    } catch (InstantiationException e) {    } catch (IllegalAccessException e) {                }对我来说,的空语句是一种代码异味,我宁愿删除它并允许抛出异常。catchEntityNotFoundException但是,当我删除该 catch 语句时,它会导致编译器错误,并且我没有看到任何关于删除该语句无效的解释或理由。正在调用实现接口的东西,这意味着可以抛出 一个,如果我们查看接口中定义的构造函数,可以看到这一点:datastore.getcom.google.appengine.api.datastore.DatastoreServiceEntityNotFoundExceptioncom.google.appengine.api.datastore.DatastoreServicepublic interface DatastoreService extends BaseDatastoreService {    Entity get(Key var1) throws EntityNotFoundException;但是,为什么我需要捕获异常?为什么我会收到编译错误?
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

Java 有两种不同的例外:选中未选中

  • 已检查的例外:

    • 任何不从 或 扩展的内容。java.lang.Throwablejava.lang.Errorjava.lang.RuntimeException

    • 必须在可以抛出它们的位置显式处理。如果不这样做,将导致编译错误。如果已检验异常被捕获在 try-catch 块中,或者如果包含方法被声明给已检验的异常,则会处理该异常。throws

  • 未选中的例外:

    • 或 的任何实例。java.lang.Errorjava.lang.RuntimeException

    • 可以捕获和处理,但不需要。也可以在方法签名的子句中使用,但这样做通常被认为是不好的做法。如果有人想记录一个未经检查的异常被一个方法抛出的可能性,他们应该在Javadoc中通过.throws@throws

基于编译错误,我只能假设是一个已检查的异常,因此必须进行处理。有关更多信息,请参阅 Java:选中与未选中异常说明EntityNotFoundException


我同意空的捕获块很臭。至少,您应该记录异常。如果您最终对每个可能的异常执行相同的操作,则可以像这样重写 try-catch:

try {

    /* Do stuff... */

} catch (EntityNotFoundException | IntantiationException | IllegalAccessException ex) {

    // log ex...

}

我相信,上述语法需要Java 7+。


查看完整回答
反对 回复 2022-09-07
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号