Меня удивляет, что если я удалю первое назначение, я получаю ошибку компиляции. Код следующий:
public void antlr(String fullyQualifiedFilename) {
String path = null;
try {
path = new File(fullyQualifiedFilename).getParent();
if (path != null) {
path = new File(path).getCanonicalPath();
}
} catch (IOException ioe) {
//...
}
if (path != null) {
int f;
}
}
, и я хочу удалить инициализацию переменной и оставить только объявление. В самом деле:
public void antlr(String fullyQualifiedFilename) {
String path;
try {
path = new File(fullyQualifiedFilename).getParent();
if (path != null) {
path = new File(path).getCanonicalPath();
}
} catch (IOException ioe) {
//...
}
if (path != null) {
int f;
}
}
Я получаю следующую ошибку: Example.java:19,9: error: Local variable path is not assigned before used
Имеет смысл ожидать, что первый конструктор File
выдает только непроверенное исключение NullPointerException
и getParent()
не вызывает никаких проверенных исключения. Итак, первое присваивание всегда вычисляет ожидаемое, если выбрасывается непроверенное исключение. Я имею в виду, что у компилятора есть вся необходимая информация, чтобы знать, что первое присваивание path = new File(fullyQualifiedFilename).getParent()
всегда выполняется.
это Это то, чем я думаю должна быть диаграмма потока управления.
Я ошибаюсь? Я что-то упускаю?