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

Другие вопросы по тегам