Ваша проблема здесь в том, что scan
не был инициализирован до блока try. Все, что находится в блоке try, может вызвать исключение, поэтому вы должны писать свой код, предполагая, что весь код в блоке try никогда не будет запущен. К счастью, в Java есть синтаксис, специально предназначенный для этой ситуации, который называется try-with-resources. Try-with-resources обрабатывает ваши ресурсы за вас и автоматически закрывает их в конце блока try. Вот ваш код, измененный для использования try-with-resources:
try (FileReader reader = new FileReader(filename);
Scanner scan = new Scanner(reader)) {
while(scan.hasNext()) {
file.add(scan.nextLine());
}
return file;
} catch (IOException e) {
e.printStackTrace();
}
return null;
Я также заметил, что в вашем блоке catch вы просто печатаете трассировку стека. Это совершенно нормально с точки зрения синтаксиса, и компилятор примет это, но я бы не рекомендовал проглатывать подобные ошибки. Если вы не хотите делать ничего особенного, лучшая универсальная линия, которую вы можете использовать, - throw new RuntimeException();
. Это просто вызывает общее исключение времени выполнения c, которое распечатывает трассировку стека, а затем завершает программу. Это также имеет дополнительное преимущество, заключающееся в том, что вам не нужна строка return null;
внизу, поскольку исключение времени выполнения все равно выйдет из программы, а затем любой метод, вызывающий этот метод, может безопасно предположить, что этот метод возвращает ненулевое значение. значение.