2017-01-23 7 views
1

Я только что наткнулся на два противоречивых предложения в Java 8 Docs и подумал, есть ли здесь кто-нибудь, кто может прояснить реальное поведение.Исключение, вызванное методом finalize в Java, противоречие в Java-документах?

«Если исключающее исключение выбрано методом finalize, исключение игнорируется и завершение этого объекта завершается».

-> Если я понял, что это «неперехваченное исключение» означает, что оно не попадает в блок try/catch, и это не имеет никакого отношения к тому, является ли это проверенным или неконтролируемым исключением.

«Любое исключение, вызванное методом finalize, заставляет завершить завершение этого объекта, но в противном случае игнорируется».

-> Это совершенно противоположное поведение ... и что они означают с «но иначе игнорируется»? Если это не выдается методом finalize ...?

Другие люди задают аналогичные вопросы, например. other stackoverflow question, но ответ был непонятен.

Я понимаю, что «остановлен» как приостановлено - или это то же самое, что и прекращено?

К слову: Я выяснил, что на самом деле это плохая практика, чтобы попытаться полагаться на финализацию, поскольку нет никакой гарантии, что она когда-либо называется (даже System.gc() не вынуждает ее и предлагает только компилятор, который сбор мусора необходим). Некоторые люди рекомендуют вместо этого использовать крюк отключения:

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     // shutdown logic 
    } 
}); 

, например. здесь stack overflow question

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

+1

Я не вижу, что они противоречивы. Статьи «исключение игнорируется» и «завершение этого объекта завершается» не находятся в самом ясном порядке; но я читал их, как грубо говоря то же самое. –

+0

Средство: «завершает» == «остановлено»? – Nina

+0

Да (это означает остановку) – alexbt

ответ

1

Первое предложение вводит в заблуждение в своем слове, но они являются одним и тем же утверждением.

Завершение «завершается» после исключения, что означает, что финализация не выполнена должным образом.

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

+0

Итак, формулировка должна быть: «исключение будет проигнорировано, и завершение этого объекта будет продолжено»? – Nina

+0

Хорошо ... поэтому программа не сбой, и метод finalize не будет завершен. Некоторое очищение не будет сделано. Но программа продолжается. – Nina

+0

Вы видите, что сборщик мусора завершает работу. Если finalize ** терпит неудачу ** и выдает исключение, он (сборщик мусора) ловит исключение и игнорирует его. – alexbt

 Смежные вопросы

  • Нет связанных вопросов^_^