Exception… finally!

Рубрика: Java, Задачки | 26 December 2007, 11:02 | juriy

Вот еще один простой вопрос, который встречается на собеседованиях:

public class Test {

	public static void test() throws Exception {
		try {
			throw new Exception("A");
		} finally {
			throw new Exception("B");
		}
	}

	public static void main(String[] args) {
		try {
			Test.test();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

Что будет напечатано в результате выполнения?

Ответ – белыми буквами на белом фоне:

Будет напечатано "В". Исключение "А" таким образом будет безвозвратно утеряно

Комментариев: 10

10 Responses to “Exception… finally!”

Комментарии:

  1. Vet

    а почему?

  2. Chabster

    Потому, что Java переносит все свои ошибки от версии к версии ))) Оператор return в блоке finally – такой же тупак.

  3. Pavel Vinogradov

    Подозреваю что причина в том что:
    1. finally выполняется в блоке try всегда. Т.е. после создания Exception(“A”) мы не покинем test()
    2. Excepшены не собираются в стек. Соответственно Exception(“B”) заменит Exception(“A”), т.к. он был создан последним перед возвратом управления в main.

  4. juriy

    Что-то вроде того. А я тем временем нашел ссылку на JLS:

    If a finally clause is executed because of abrupt completion of a try block and the finally clause itself completes abruptly, then the reason for the abrupt completion of the try block is discarded and the new reason for abrupt completion is propagated from there.

  5. Olostan

    Имхо вполне логичное и ожидаемое поведение именно по тому, зачем нужен finally – для того, чтобы в любом случае иметь возможность освободить ресурсы/откатить операции/и и определить логику поведения в _любом_ случае, в т.ч. при ексепшене.

  6. mp

    в C# точно так же. А ожидания какие были? Что нелогичного?

  7. Anton Naumov

    потому, что если в блоке finally возникло не обработанное исключение (как в примере), то совершенно не важно, закончилась основная логика метода нормально, произошло ли в методе ислючение или возникла ошибка. в любом случае, после исполнения метода программа будет переключена в исключительный поток исполнения.

  8. Вереск

    А не обернуть ли нам код в блоке finally в еще один try-catch?

  9. ilja k

    2Вереск: нет смысла – в заголовке метода есть слова “throws Exception” поэтому исключение будет поймано по-любому.

Leave a Reply