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

在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.DatastoreServiceEntityNotFoundException


com.google.appengine.api.datastore.DatastoreService


public interface DatastoreService extends BaseDatastoreService {

    Entity get(Key var1) throws EntityNotFoundException;

但是,为什么我需要捕获异常?为什么我会收到编译错误?


牧羊人nacy
浏览 105回答 1
1回答

慕田峪4524236

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+。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java