Хе-хе. А если вместо return 1; поставить System.exit(1);, то она не вернет 0!
Логично же.
А вообще за ранние возвраты надо бить по рукам.
Можно, но лучше без них обойтись. В Scala их вообще нет, например.
В смысле, finally исполняетсям даже если в try стоут возврат? А как это устроено? Просто сделано ТАК или есть какая-то логика?
Да, так специально задумано. Блок "finally" исполняется всегда. Туда обычно кладут всякий cleanup code.

Устроено так же как, например, деструкторы в С++: перед выходом из скопа где объявлен finally (в данном случае скоп это вся функция) исполняются все блоки finally и прочий unwind.

return в данном случае не выходит из функции, а кладёт указанное значение (1) в регистр возврата, или что там у Джавы для этого. Затем flow переходит к блоку "finally".

П.С. Прошу прощения за корявый русский, не знаю как это всё правильно называется.

Edited at 2018-07-27 09:03 am (UTC)
Спасибо. То-есть, блок "бросить - поймать" управляет течением поверх даже возвратов.
Совершенно верно. Либо можно сказать что возвраты, котрые мы пишем это не настоящие ёлочные игрушки выходы из функции, а просто просьба компилятору: как всё закончишь, то верни вот это из функции.
Не понимаю этого языка. Но там же по-английски написано: "В конце-концов вернуть 0". Чего же еще от нее ожидать?