Исключение, выданное методом финализации в Java, противоречие в документации Java?
Я только что натолкнулся на два противоречивых предложения в Java 8 Docs и подумал, есть ли здесь кто-нибудь, кто может прояснить реальное поведение.
"Если с помощью метода finalize генерируется неперехваченное исключение, исключение игнорируется, и завершение этого объекта завершается".
-> Если я правильно понял, "неперехваченное исключение" означает, что оно не перехватывается блоком try/catch, и это не имеет никакого отношения к тому, является ли это проверенным или непроверенным исключением.
"Любое исключение, выдаваемое методом finalize, вызывает остановку завершения этого объекта, но в противном случае игнорируется".
-> Это совершенно противоположное поведение... и что они означают с "но в противном случае игнорируется"? Если это не брошено методом финализации...?
Другие люди задают подобные вопросы, например, другой вопрос stackru, но ответ не был понятен.
Я понимаю "остановлено" как приостановленное - или это то же самое, что прекращено?
Кстати: я обнаружил, что на самом деле плохая практика - полагаться на финализацию, так как нет гарантии, что она когда-либо будет вызываться (даже System.gc() не форсирует ее и предлагает компилятору только то, что сборка мусора необходима), Некоторые люди рекомендуют вместо этого использовать отключающий хук:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
например, здесь вопрос переполнения стека
Тем не менее, я думаю, что документы Java должны быть ясными и не содержать противоречивых истин.... Или это проблема английского языка...?
1 ответ
Первое предложение вводит в заблуждение своими словами, но это одно и то же утверждение.
Завершение "завершается", как только генерируется исключение, что означает, что завершение не завершено должным образом.
В отличие от обычной программы, где необработанное исключение может вызвать сбой всей программы, если finalize
выдает исключение, программа просто движется как обычно.