Почему IntelliJ показывает ошибку компиляции, когда я не улавливаю ожидаемый тип исключения? - PullRequest
0 голосов
/ 29 марта 2019

В 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;

Зачем мне нужно , чтобы поймать исключение?Почему я получаю ошибку компиляции?

1 Ответ

2 голосов
/ 30 марта 2019

Java имеет два различных типа исключений: проверено и не проверено .

  • Проверенные исключения:

    • Любой java.lang.Throwable, который не начинается с java.lang.Error или java.lang.RuntimeException.
    • Должен быть явно обработан, где они могут быть брошены. Невыполнение этого приводит к ошибке компиляции. Проверенное исключение обрабатывается, если оно перехвачено в блоке try-catch или если содержащий метод объявлен как throws проверенное исключение.
  • Непроверенные исключения:

    • Любой экземпляр java.lang.Error или java.lang.RuntimeException.
    • Может быть пойман и обработан, но не должен быть. Может также использоваться в предложении throws сигнатуры метода, но это обычно считается плохой практикой. Если кто-то хочет задокументировать возможность создания неконтролируемого исключения методом, он должен сделать это в Javadoc через @throws.

Исходя из ошибки компиляции, я могу только предположить, что EntityNotFoundException является проверенным исключением и поэтому должно обрабатываться. Для получения дополнительной информации см. Java: проверено и не проверено объяснение исключения .


Я согласен, что пустой блок улова вонючий. По крайней мере, вы должны зарегистрировать исключение. Если вы в конечном итоге делаете одно и то же для каждого возможного исключения, вы можете переписать try-catch следующим образом:

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

Мне кажется, что приведенный выше синтаксис требует Java 7+.

...