我是初学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();
}
}
}
答案 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块中的扫描程序,而是使用单独的方法,一旦读取整个文件就应该调用它。