Помощь с try / catch и доступом к элементам внутри try - PullRequest
1 голос
/ 16 февраля 2011
try {
    inFile = new Scanner(file);
}
catch (FileNotFoundException e) {
    System.out.println("FileNotFoundException");
}

У меня есть этот код. Однако после оператора try / catch у меня есть следующее:

while(inFile.hasNext()) {
}

Компилятор говорит мне, что я не инициализировал inFile. Нужно ли помещать весь мой код в try / catch? Что я делаю не так?

Ответы [ 8 ]

2 голосов
/ 16 февраля 2011

Компилятор жалуется, потому что если new Scanner() сгенерирует FileNotFoundException, inFile не будет инициализирован (кстати, очень неудачное имя переменной). Ваш цикл должен быть внутри блока try, что также повысит читабельность.

try {
    Scanner inFile = new Scanner(file);
    while(inFile.hasNext()) {
        //...
    }
    inFile.close();
}
catch (FileNotFoundException e) {
    System.out.println("FileNotFoundException");
}
2 голосов
/ 16 февраля 2011

Если вы получаете ошибку компилятора, вам, вероятно, нужно инициализировать inFile как ноль.

Обратите внимание, что позже в вашем коде вы не должны предполагать, что inFile не равен нулю, вы всегда должны проверять его:

например

if (inFile != null) {
    while (inFile.hasNext()) {
        ...
    }
}
2 голосов
/ 16 февраля 2011

Initialize inFile:

Scanner inFile = null;

Редактировать:

Как уже упоминали другие, вы должны быть осторожны, чтобы потенциально получить исключение NullPointerException в цикле while.Вам также следует рассмотреть возможность перемещения вашего цикла while в блок try:

Scanner inFile = null;
...
try {
    inFile = new Scanner(file);
    while(inFile.hasNext()) {
    }    
}
catch (FileNotFoundException e) {
    System.out.println("FileNotFoundException");
}
1 голос
/ 16 февраля 2011

Да, вы делаете. Если возникает исключение, среда выполнения напечатает «FileNotFoundException» и продолжит работу, хотя inFile не будет инициализирован.

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

0 голосов
/ 16 февраля 2011

Да, как уже говорили другие, инициализируйте inFile в null

Однако вам также необходимо проверить, что inFile действительно указывает на действительный файл и не равен NULL, когда вы попадаете в цикл, например

while(inFile!=null && inFile.hasNext()) {
}

В противном случае, вы, возможно, захотите поместить весь try-catch в другой цикл, чтобы пользователь выбрал другой файл?Или просто выйдите из программы, если файл недействителен?Отсутствующий элемент вопроса - как вы хотите обрабатывать недопустимые файлы.Программа завершает работу или повторно запрашивает пользователя?

0 голосов
/ 16 февраля 2011

Причина предупреждения заключается в том, что вы должны изначально установить для сканера значение null. Однако вам также следует переместить цикл while внутри блока try, потому что если выдается исключение, вы не хотите, чтобы этот цикл while выполнялся (потому что inFile будет нулевым).

0 голосов
/ 16 февраля 2011

Нет, ваш код в порядке, однако локальные переменные должны быть инициализированы, поэтому вы должны установить Scanner inFile = null;

И это правильно, что вы уже сделали, потому что если вы перемещаете локальную переменную внутри try /оператор catch у вас не будет доступа к нему из-за области действия.

Scanner inFile = null;

try {
    inFile = new Scanner(file);
    //more code
} catch (Exception e) {
    //exception code
}

while (inFile.nextLine()) {
    //loop code
}

Если бы у вас была переменная экземпляра, она была бы автоматически установлена ​​равной нулю, но в этом случае у вас есть локальная переменная, а затем объектыперед использованием необходимо инициализировать.

0 голосов
/ 16 февраля 2011

Блок try не находится в той же области, что и цикл while. Поместите цикл while в блок try.

...