无法在Java

时间:2015-05-05 13:52:36

标签: java insert line

我是初学Java程序员。我正在编写一个扫雷游戏,我想在myhighscore表中插入一行。 每次,第一次essai都是成功的但是当我重播时,我无法插入一行而且我有一个错误:

  

线程“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 个答案:

答案 0 :(得分:0)

根据注释,您应该执行的操作是从对象/类本身中删除扫描程序成员字段,并在每次要读取方法体内的文件时创建 new 扫描程序。结合使用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)线程中阻止IO。这通常是个坏主意,因为这意味着在IO完成之前,您的GUI将被阻止。出于类似的原因,未捕获的异常对于GUI响应也是一个非常糟糕的预兆。因此,在GUI线程中执行IO可以用于学习/玩具程序,但是对于更强大的程序,您应该考虑将读取/写入高分的工作委托给不同的线程。 (Swingworker或ExecutorService非常合适。)这种关注并非特定于Java,它转化为许多常见UI工具包(如Qt或GTK)和其他各种语言的基于事件循环的库的类似问题。 / p>

答案 1 :(得分:0)

Scanner是一个类级变量,你在finally块中关闭它,因此第二次它无法读取。

解决方案:有两个选项,要么使用user268396建议的,要么不关闭finally块中的扫描程序,而是使用单独的方法,一旦读取整个文件就应该调用它。