Не могу вставить строку в мою таблицу рекордов в Java
Я начинающий программист на Java. Я программирую игру тральщика и хочу вставить строку в таблицу рекордов. Каждый раз первое эссе проходит успешно, но при воспроизведении я не могу вставить строку и у меня появляется ошибка:
Исключение в потоке "AWT-EventQueue-0" java.lang.IllegalStateException: Сканер закрыт
Кто-нибудь мог увидеть проблему?
public void insererLigne(String texte, int numLine, int numDelLine) {
List<String> fileLines = new ArrayList<String>();
try {
for (int i = 1; scanner.hasNextLine(); i++) {
String line = scanner.nextLine();
if (i == numLine) {
fileLines.add(texte);
}
if (i != numDelLine) {
fileLines.add(line);
}
}
}
finally {
if (scanner != null) {
scanner.close();
}
}
PrintWriter pw = null;
try {
pw = new PrintWriter(fichier);
for (String line : fileLines) {
pw.println(line);
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
finally {
if (pw != null) {
pw.close();
}
}
}
2 ответа
Основываясь на комментариях, вам нужно удалить поле члена сканера из самого объекта / класса и создавать новый сканер каждый раз, когда вы хотите прочитать файл внутри тела метода. Включая предложение использовать try-with-resources, вы получите что-то вроде этого:
try (Scanner scanner = new Scanner(fichier)) {
// use scanner here as before
}
catch(FileNotFoundException e) {
// do something sensible here...
// can probably ignore, no highscore file yet.
}
// no finally block needed, scanner cleaned up automatically
try (PrintWriter pw = new PrintWriter(fichier)) {
// use pw here as before.
}
catch(FileNotFoundException|IOException e) {
// do something sensible here. unable to write highscore file(!)
}
// no finally block needed, pw cleaned up automatically
РЕДАКТИРОВАТЬ: Как дополнительное примечание, вы должны знать, что вы делаете блокировку ввода-вывода в потоке диспетчеризации событий AWT (GUI). Как правило, это плохая идея, потому что это означает, что ваш графический интерфейс будет заблокирован до завершения ввода-вывода. По тем же причинам невыясненные исключения также являются очень плохим предзнаменованием для отзывчивости GUI. В результате выполнение ввода-вывода в потоке GUI нормально для обучающих / игрушечных программ, но для более надежных программ вы должны обратить внимание на делегирование работы по чтению / записи рекордов другому потоку. (Подойдет Swingworker или ExecutorService.) Эта проблема не является специфической для Java, она выражается в аналогичных проблемах со многими распространенными наборами инструментов пользовательского интерфейса (такими как Qt или GTK) и другими библиотеками на основе цикла событий на множестве языков.
Scanner - это переменная уровня класса, и вы закрываете ее в блоке finally, поэтому второй раз он не может прочитать.
Решение: есть два варианта: либо использовать предложенный пользователем user268396, либо не закрывать сканер в блоке finally, вместо этого использовать отдельный метод, который должен вызываться после прочтения всего файла.