2015-05-05 4 views
1

Я начинающий программист на Java. Я программирую игру тральщика и хочу вставить строку в таблицу myhighscore. Everytime, первый Essai является успешным, но когда я переигрывать, я не могу вставить строку и у меня есть ошибка:Невозможно вставить строку в таблицу рекордов в Java

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Scanner closed

Любой желающий мог увидеть проблему?

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();   
     }   
    }  
} 
+3

исключение говорит, что сканер закрыт, можно было бы поделиться кодом, в котором вы объявили и инициализировали объект сканера –

+1

И, пожалуйста, переформатируйте код в своем сообщении - я подозреваю, что вы действительно не имеете пустую строку между каждой строкой код ... (я также настоятельно рекомендую вам использовать инструкцию try-with-resource вместо ручного закрытия вещей и очень нервничать каждый раз, когда ваша «обработка» исключения просто сбрасывает трассировку стека и продолжается, как если бы все было в порядке ...) –

+2

Сканер, вероятно, является полем-членом и закрыт, потому что первый запуск этого метода фактически закрывает его в блоке 'finally {}' (!). – user268396

ответ

0

Основываясь на комментариях, что вы должны сделать, это удалить поле члена сканера от самого объекта/класса и создайте новый Scanner каждый раз, когда вы хотите, чтобы прочитать файл внутри тела метода. Включение предложения использовать примерочный с-ресурсами, вы получите что-то вроде этого:

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 

EDIT: В качестве дополнительной записки, вы должны знать, что вы делаете, блокирование операций ввода-вывода в отправке AWT Event (GUI) нить. Это, как правило, плохая идея, потому что это означает, что ваш графический интерфейс будет заблокирован до завершения ввода-вывода. По аналогичным причинам исключаемые исключения также являются очень плохим предзнаменованием для реагирования GUI. В результате выполнение ввода-вывода в потоке GUI подходит для учебных/игрушечных программ, но для более надежных программ вы должны рассмотреть делегирование работы по чтению/записи рекорда в другой поток. (Swingworker или ExecutorService будет хорошо подходить.) Эта проблема не относится к Java, она переводится в аналогичные проблемы со многими распространенными инструментами пользовательского интерфейса (такими как Qt или GTK) и другими библиотеками на основе циклов событий на разных языках.

+0

спасибо, он работает –

0

Сканер представляет собой переменную уровня класса, и вы закрываете ее в блоке finally, тем самым второй раз ее не умеет читать.

Решение: есть два варианта: либо использовать то, что пользователь268396 предложил, либо не закрыл сканер в блоке finally, вместо этого имеет отдельный метод, который должен быть вызван после того, как будет прочитан весь файл.

Смежные вопросы