Присвоение значения по умолчанию конечной переменной в случае исключения в Java - PullRequest
8 голосов
/ 09 апреля 2010

Почему Java не разрешает мне присваивать значение конечной переменной в блоке catch после установки значения в блоке try, даже если окончательное значение невозможно записать в случае исключения. 1001 *

Вот пример, демонстрирующий проблему:

public class FooBar {

    private final int foo;

    private FooBar() {
        try {
            int x = bla();
            foo = x; // In case of an exception this line is never reached
        } catch (Exception ex) {
            foo = 0; // But the compiler complains
                     // that foo might have been initialized
        }
    }

    private int bla() { // You can use any of the lines below, neither works
        // throw new RuntimeException();
        return 0;
    }
}

Проблема не сложная, но я хотел бы понять, почему компилятор не принимает это.

Заранее спасибо за любые материалы!

Ответы [ 3 ]

7 голосов
/ 09 апреля 2010
try {
    int x = bla();
    foo = x; // In case of an exception this line is never reached
} catch (Exception ex) {
    foo = 0; // But the compiler complains
             // that foo might have been initialized
}

Причина в том, что компилятор не может сделать вывод, что исключение может быть выдано только до инициализации foo. Этот пример является частным случаем, когда очевидно, что это так, но рассмотрим:

try {
    int x = bla();
    foo = x; // In case of an exception this line is never reached...or is it?
    callAnotherFunctionThatThrowsAnException();  // Now what?
} catch (Exception ex) {
    foo = 0; // But the compiler complains
             // that foo might have been initialized,
             // and now it is correct.
}

Написать компилятор для обработки таких специфических случаев, как это, было бы огромной задачей - их, вероятно, очень много.

2 голосов
/ 09 апреля 2010

Чтобы быть педантом, Thread.stop(Throwable) может выдать исключение сразу после назначения блока попытки.

Однако правила с определенным назначением и родственными терминами достаточно сложны. Проверьте JLS. Попытка добавить больше правил усложнит язык и не даст существенной выгоды.

0 голосов
/ 09 апреля 2010

Как насчет броска Error?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...