【问题标题】:Analysing text that is read from a file in Java分析从 Java 文件中读取的文本
【发布时间】:2015-03-26 20:20:23
【问题描述】:

我正在编写一个程序来分析输入的文本并计算平均字母数。 我让它在用户输入文本时工作,但我无法让它在从文件中读取文本时工作。

public static void ReadFromFile() throws IOException  {
String filename = "name.txt";
String str = new String(new char[100]);
try{
    FileReader fr = new FileReader(filename);
    BufferedReader br = new BufferedReader(fr);

    while ((str = br.readLine()) !=null) {
    System.out.println(str + "\n");
    }
    br.close();
    } catch(IOException e) {
        System.out.println("File not found");
    }
while (c != str.length()) {
    if (str.charAt(c) >= 'a' && str.charAt(c) <= 'z') {
        count[str.charAt(c) - 'a']++;   
    }
    c++;
}
for (c = 0; c<26;c++){
    if (count[c] !=0){
        double num = count[c];
        double denom = str.length();
        double average = num / denom;
        System.out.print((char) (c + 'a') + " occurs " + count[c] + " times in the entered string. Average is ");
        System.out.println(average);
    }}}}

我不断收到一个错误提示

Exception in thread "main" java.lang.NullPointerException
at MainMenu.ReadFromFile(MainMenu.java:79)
at MainMenu.main(MainMenu.java:25)

任何帮助将不胜感激 谢谢

【问题讨论】:

  • 第 79 行是“while (c != str.length()) {”

标签: java arrays file console ioexception


【解决方案1】:

您正在逐行读取整个文件并将其打印到 System.out

完成后,您尝试处理数据,但您已经完成了文件的读取,因此 str 为“null”并且您的程序死亡。

【讨论】:

  • 有道理,我原以为是这样的。我试图找到另一种从文件中读取的方法,但我找不到。我将如何纠正这个问题?
  • 在你 System.out.println() 之后,你应该把你的逻辑用于循环字符。不是在循环完成后。您将在一个循环中有一个循环。
  • 现在是时候练习编程中最重要的部分——调试了!使用调试器单步调试您的程序,看看发生了什么!
【解决方案2】:

在你的代码前面,你有这个循环:

while ((str = br.readLine()) != null) {
    System.out.println(str + "\n");
}

这将从您的文件中读取行,而 str 不是 null
这意味着当它停止时,str null

由于之后您没有给str 提供非null 值,因此当您稍后在代码中尝试在str 上运行方法时,您会得到一个NPE:

while (c != str.length()) {  // str is null here!
    if (str.charAt(c) >= 'a' && str.charAt(c) <= 'z') {
        count[str.charAt(c) - 'a']++;
    }
    c++;
}

通过查看您的代码,我猜测您希望收集有关文件中每一行的信息。为此,不要只打印每一行,而是将计数逻辑移到正在读取文件的循环中:

// read each line from the file
while ((str = br.readLine()) != null) {
    System.out.println(str + "\n");

    // collect character data for this line
    while (c != str.length()) {
        if (str.charAt(c) >= 'a' && str.charAt(c) <= 'z') {
            count[str.charAt(c) - 'a']++;
        }
        c++;
    }
}

然后在后面的代码中处理计数数组,就像你已经在做的那样。

【讨论】:

  • 我似乎仍然无法让它工作。在同一点出现错误。
  • 什么错误?您对代码做了哪些更改?
  • MainMenu.main(MainMenu.java:25) 处的 MainMenu.ReadFromFile(MainMenu.java:86) 线程“main”java.lang.NullPointerException 中的异常
  • 您是在文件读取循环中添加字符检查循环,还是在文件读取循环中移动字符检查循环?之前破坏的代码如果留在原处仍然会破坏。读完文件后不能再拨打str.length()
  • 是的,我已经移动了它,但我仍然遇到同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多