Я новичок в Java, и мне было интересно, есть ли у меня следующий типичный код Java
public class MyApp {
public static void main(String[] args) {
try {
// do stuff
} catch {
// handle errors
} finally {
// clean up connections etc.
}
}
}
гарантирует ли JVM, что блок finally всегда будет выполняться? Чтобы понять, откуда я пришел, я привык к программам на C / C ++, которые могут просто аварийно завершить работу, если вы разыменуете указатель NULL и у вас не будет кода для запуска после этого.
Но, поскольку я понимаю Java и весь бизнес GC / управляемой памяти в целом, нет такой вещи, как разыменование нулевого указателя, все это ловимое ожидание, так что на самом деле моя программа не может завершиться сбоем, которая могла бы ее сделать пропустить наконец, или есть? Например, в Python я обычно делаю
try:
# do stuff
except AnExceptionIKnewMightHappen:
# react in an appropriate way
except:
# log that weird error I had not known could happen
и у меня никогда не было приложений, которые могли бы умереть без прохождения моего кода.
Конечно, если ОС по какой-то причине убивает процесс (или если что-то убивает всю систему, например, отключение), Java мало что может сделать. Кроме того, из PHP я знаю неуловимые ошибки, от которых вы не можете защититься, даже если интерпретатор все еще был там после того, как это произошло (по крайней мере, он может вывести правильное сообщение).
Редактировать: Просто для ясности (никто не понял, что это неправильно), позвольте мне добавить, что я искал вещи внутри моего кода , которые могли бы привести к окончательному существованию обойдены. Поэтому указание на System.exit было полезным напоминанием, хотя я не понимаю, почему я хотел бы сделать что-то подобное.
Выход из JVM - довольно очевидный путь, и я бы посчитал это внешней причиной. Примечание, указывающее на то, что вы также должны помнить о возможности выхода потоков, пока JVM и приложение продолжают работать, было очень полезным, потому что, хотя мне это и сейчас кажется очевидным, я не думал об этом.