为什么当我没有捕捉到一个预期的异常类型时,IntelliJ会显示一个编译错误?

0 人关注

在IntelliJ中,我正在编写一些从Google Cloud DataStore检索实体的代码,使用像这样的 try catch 块。

    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) {            

catch 对我来说,EntityNotFoundException 的空语句是一种代码气味,我宁愿删除它并允许抛出异常。

然而,当我删除这个catch语句时,它导致了一个编译器错误,而且我没有看到任何解释或理由来说明为什么删除这个语句是无效的。

datastore.get 正在调用实现了com.google.appengine.api.datastore.DatastoreService 接口的东西,这意味着有可能抛出一个EntityNotFoundException ,如果我们看一下接口中定义的构造函数,就可以看到这一点。

com.google.appengine.api.datastore.DatastoreService

public interface DatastoreService extends BaseDatastoreService {
    Entity get(Key var1) throws EntityNotFoundException;

但为什么我需要捕捉这个异常呢?为什么会出现编译错误?

2 个评论
Slaw
EntityNotFoundException 是一个 检查过的 异常吗?检验过的异常 必须 被处理;这意味着要么捕获它们,要么声明该方法可以抛出异常。参见 stackoverflow.com/questions/6115896/.. .
谢谢@Slaw,我想你应该把这句话作为一个答案加进去。我不知道为什么OP被降权了。你提供的链接问题很有用,但似乎是假设开发者已经对检查性与非检查性异常有了合理的认识。我认为OP的格式很好,可以让人(比如我)得出初步的理解。有没有人可以评论一下降权的问题,或者对OP提出改进建议?
java
exception
intellij-idea
google-cloud-datastore
Chris Halcrow
Chris Halcrow
发布于 2019-03-29
1 个回答
Slaw
Slaw
发布于 2019-03-30
已采纳
0 人赞同

Java有两种不同的异常: 检查的 未检查的

  • 检查过的异常。

  • 任何不从 java.lang.Error java.lang.RuntimeException 扩展的 java.lang.Throwable
  • 必须在它们可以被抛出的地方明确处理。不这样做会导致一个编译错误。如果一个检查过的异常在try-catch块中被捕获,或者如果包含的方法被声明为 throws ,那么这个检查过的异常就会被处理。
  • 未检查的异常。

  • java.lang.Error java.lang.RuntimeException 的任何实例。
  • 可以被捕获和处理,但不需要。也可以在方法签名的 throws 子句中使用,但这样做通常被认为是不好的做法。如果想记录一个方法抛出未检查异常的可能性,他们应该在Javadoc中这样做,通过 @throws
  • 根据编译错误,我只能假设 EntityNotFoundException 是一个 被检查的 异常,因此必须被处理。欲了解更多信息,请参见 Java:检查过的异常与未检查过的异常解释

    我同意,一个空的catch块是很臭的。最起码,你应该记录这个异常。如果你最终对每个可能的异常都做同样的事情,你可以像这样重写try-catch。

    try {
        /* Do stuff... */
    } catch (EntityNotFoundException | IntantiationException | IllegalAccessException ex) {
        // log ex...