Автор правильно пишет. Если исключение выбросится на строке
lnputFile in = new InputFile("Cleanup.java")j, то оно попадёт сразу в
catch(Exception e) { System.out.println("Ошибка при конструировании InputFile"); }. Здесь finally не выполняется, так как исполнение кода не заходит в try блок, к которому прикреплён тот finally.
Но если исключение стрельнет где-то внутри цикла
while((s = in.getLine()) != null), то сработает внутренний catch блок и finally блок. Внешний catch не будет выполнен.
А если в блоке try либо catch выполнить System.exit() ?
В таком случае finally блок не будет выполнен, так как
javadoc System.exit() чётко пишет: "This method never returns normally." А раз метод не возвращает управление, то try блок не выполняется до конца, соответственно finally не запускается.