Я новичок в 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/С++, которые могут просто сбой, если вы разыщите указатель 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 и приложение продолжают работать, очень помогли, потому что, хотя это также кажется мне очевидным, я не думал об этом.