AutoCloseable и выбрасывает исключение - PullRequest
0 голосов
/ 29 июня 2018

В AutoCloseable есть метод «Исключение при закрытии пустых ситуаций». Некоторые предлагают расширить этот интерфейс, переопределить метод close и удалить исключение. Смотрите, например, ссылку ниже.

Но когда я забываю поместить оператор в оператор try-with-resources, это метод close, а не вызывается?

  • В try-with-resources закрытие называется
  • В потоке api закрытие называется
  • Автоматически по Java, когда, например, выход из метода, в котором создается ресурс ???

Дополнительная информация Я искал в Интернете и посмотрел на документацию. Оба предложили убрать исключение из условия оператора. Но моя реакция на это предположение состоит в том, что когда в будущем кто-то в нашем проекте реализует новый интерфейс (без исключения) и забывает поместить их в попытку с ресурсом, что приводит к утечке ресурсов. Для нашего проекта это не большая проблема, потому что мы используем SonarQube, в котором будет упоминаться утечка ресурсов

Пример местоположения:

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Метод AutoCloseable.close() не является деструктором (в Java нет деструкторов) - он был специально создан для try-with-resources и поэтому не вызывается, если не используется в этом операторе - см. документацию :

Метод close () объекта AutoCloseable вызывается автоматически при выходе из блока try-with-resources, для которого объект был объявлен в заголовке спецификации ресурса. Эта конструкция обеспечивает быстрое освобождение, избегая исключений исчерпания ресурсов и ошибок, которые могут возникнуть в противном случае.

0 голосов
/ 29 июня 2018

В AutoCloseable есть метод «Исключение при закрытии по недействительным значениям». Некоторые предлагают расширить этот интерфейс, переопределить метод close и удалить исключение.

Ссылка, которую вы разместили, не предполагает, что в общем случае она показывает, почему пакет io имеет свой собственный интерфейс Closeable, который выдает только IOException (потому что ему не нужно бросать более общий Exception.) Это делает нулевую разницу во время выполнения, оно чисто на месте, поэтому выдается ошибка компилятора, если что-то пытается выдать что-то, что не исключение IOException при использовании интерфейса io.Closeable.

Но когда я забываю поместить оператор в оператор try-with-resources, это метод close, а не вызывается?

Вы, похоже, подразумеваете здесь ссылку, где ее нет - тип исключения, которое может выдать AutoCloseable, на самом деле не имеет ничего общего с закрытым ресурсом, который он оборачивает.

В try-with-resources закрытие называется

Да, в этом весь смысл языковой функции.

В потоке API закрытие называется

Нет, если вы не заключите его в блок с ресурсами.

Автоматически по Java, когда, например, выход из метода, в котором создается ресурс ???

Нет, если вы забудете закрыть ресурс, он просто останется открытым.

(Единственное исключение из этого правила - это когда ресурс закрывается в финализаторе, который выполняется непосредственно перед сборкой мусора. На это, безусловно, не стоит полагаться, просто (иногда) он используется как запасной вариант.)

0 голосов
/ 29 июня 2018

Try-with-resources автоматически вызывает close, когда ресурс выходит из области видимости (также: вы можете объявить AutoClosable только в try-with-resources). Если вы забыли поместить свой ресурс в эту языковую конструкцию, вам придется закрыть его вручную.

...