0

在这里,我只是尝试从保存的文件中读取行,然后将它们显示在 JTextArea 中。

注意:我尝试显示的 JTextArea 已经过测试并且工作正常,因此问题不存在。

    try
    {
        File ScoreFile = new File("ScoreFile.FILE"); 
        FileInputStream Read1 = new FileInputStream(ScoreFile);
        InputStreamReader Read2 = new InputStreamReader(Read1); 
        BufferedReader ReadIt = new BufferedReader(Read2);

        String score  = ReadIt.readLine();  
        String score1 = ReadIt.readLine();


        GraphicGameBoard.topScoreDisplay.setText(score  + "\n");
        GraphicGameBoard.topScoreDisplay.setText(score1 + "\n");


        ReadIt.close();
        Read2.close();
        Read1.close();

    }
    catch (Exception X) { System.out.print("Oops, Can't Load.");}

这将每次都捕获异常。我已经确定,如果我删除在 topScoreDisplay 中设置文本的尝试,它将正确地将文件中的数据保存到 score 和 score1 变量中,而不会捕获异常。

我尝试了很多场景,但它们都因不同的原因而失败。

1:这失败了,因为 score 和 score1 尚未在 try/catch 之外初始化,但在 try/catch 内部,变量已成功存储数据,如 System.out.print 所示。如果我将 System.out.print 移到 try/catch 之外,则不会打印。

   try
    {
        File ScoreFile = new File("ScoreFile.FILE"); 
        FileInputStream Read1 = new FileInputStream(ScoreFile);
        InputStreamReader Read2 = new InputStreamReader(Read1); 
        BufferedReader ReadIt = new BufferedReader(Read2);

        String score  = ReadIt.readLine();  
        String score1 = ReadIt.readLine();

        System.out.print(score + "\n" + score1 + "\n");

        ReadIt.close();
        Read2.close();
        Read1.close();

    }
    catch (Exception X) { System.out.print("Oops, Can't Load.");}

     GraphicGameBoard.topScoreDisplay.setText(score  + "\n");
     GraphicGameBoard.topScoreDisplay.setText(score1 + "\n");

2:如果我在 try/catch 之前初始化变量,那么 System.out.print 将使用 try/catch 内部或外部的正确信息。如果 .setText 在里面,它将捕获异常。如果它在外面,它将导致 NPE。

         String score;
         String score1;

   try
    {
        File ScoreFile = new File("ScoreFile.FILE"); 
        FileInputStream Read1 = new FileInputStream(ScoreFile);
        InputStreamReader Read2 = new InputStreamReader(Read1); 
        BufferedReader ReadIt = new BufferedReader(Read2);

        score  = ReadIt.readLine();  
        score1 = ReadIt.readLine();

        System.out.print(score + "\n" + score1 + "\n");

        ReadIt.close();
        Read2.close();
        Read1.close();

    }
    catch (Exception X) { System.out.print("Oops, Can't Load.");}

     GraphicGameBoard.topScoreDisplay.setText(score  + "\n");
     GraphicGameBoard.topScoreDisplay.setText(score1 + "\n"); 

因此,我可以将文件数据保存到变量中,然后可以使用 System.out.print 显示它。但我不能将变量用于 .setText。我究竟做错了什么?

4

2 回答 2

1

你没有说什么例外是X.printStackTrace();你朋友发现的。

我猜这是因为您试图从非 ui 线程更改 UI。

要解决此问题,您需要执行以下操作:

final String score  = ReadIt.readLine();  
final String score1 = ReadIt.readLine();
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        GraphicGameBoard.topScoreDisplay.setText(score  + "\n");
        GraphicGameBoard.topScoreDisplay.setText(score1 + "\n");
    }
});

最好使用 finally 块关闭您的流。

所以try {在创建每个流之后,然后} finally { stream.close();}在你完成它之后。这样做的原因是,无论出现什么问题,您都会清理您正在使用的资源。

您可能希望在循环中读取这些行:

final StringBuilder sb = new StringBuilder();
for (String line = readIt.nextLine(); line != null; line = readIt.nextLine()) {
    sb.append(line);
    sb.append("\n");
}

GraphicGameBoard.topScoreDisplay.setText(sb.toString());
于 2013-08-13T20:54:13.320 回答
1

我首先有几点意见:

1) 变量不能以大写开头,它违反了java编码约定,因此难以阅读

2)请粘贴stacktrace,这样我们就可以看到,到底发生了什么

3) 选择是否要使用 InputStream 或 Reader 接口。你以奇怪的方式混合它们。请参阅 FileReader javadoc。

跟进:

较短的版本:

BufferedReader reader = null; 
try { 
    reader = new BufferedReader(new FileReader("scores.txt")); 
    /* Tom's variant */ 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    if (reader != null) {
        reader.close(); 
    }
}
于 2013-08-13T20:57:12.193 回答