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.
}
Написать компилятор для обработки таких специфических случаев, как это, было бы огромной задачей - их, вероятно, очень много.