【问题标题】:Fix NullPointerException [closed]修复 NullPointerException [关闭]
【发布时间】:2014-09-15 22:07:20
【问题描述】:

我正在编写代码来读取文本文件并计算文本文件中的所有单词。但是在 while 循环中,字符串数组得到了 NullPointerException。我有点明白这意味着该对象没有被指向或类似的东西,但我不知道如何修复它。

public class W273 {
    public static void main(String[] args) throws IOException {
        while (JPL.test()) {
            String fileName = "phillip.txt";
            BufferedReader in = new BufferedReader(new FileReader(fileName));
            String line = in.readLine();
            String[] words = line.split(" ");
            int count = 0;
            String loop;
            while (in != null) {
                // move this line
                words = line.split(" ");

                for (int i = 0; i < words.length; i++) {
                    loop = words[i]; // NullPointerException here
                    count++;
                }

                line = in.readLine();
            }
            in.close();
            System.out.print(count);
        }
    }
}

【问题讨论】:

  • 我敢打赌这不是你的 NPE 发生的地方。
  • 我在这里看到一个无限循环...
  • 您的意思是while (line != null)?此外,您可能想查看do { } while (test); 结构。您可以消除对line 的冗余初始捕获。
  • 请发布完整堆栈跟踪。 将其编辑到问题中
  • @owlstead:这个问题是针对 OP 的,in 在 while 循环中的任何地方都不能为空。

标签: java arrays string nullpointerexception


【解决方案1】:

您的程序可能需要进行一些重组。以下是我的处理方法:

尽量减少你的字段声明。您不需要linewords 的初始定义

String fileName = "phillip.txt";
String line;
int count = 0;
BufferedReader in;

小心使用流。读取文件出现异常时应处理:

try {
    in = new BufferedReader(new FileReader(fileName));

接下来,赋值line,检查赋值运算符的结果是否为null。当文件中没有更多行时,测试将失败并退出循环。

    while ((line = in.readLine()) != null) {

您可以在一行中增加count。你似乎没有对loopwords 做任何事情,所以现在我从这个例子中省略了。

        count += line.split(" ").length;
    }

关闭缓冲阅读器(无论如何!)并退出。

} finally {
    if (in != null)
        in.close();
}
System.out.print(count);

【讨论】:

  • 太棒了,谢谢,效率更高了。只是一个问题:如果计数是 76403 但我知道它实际上应该是 73057 你认为代码可能是什么问题?
  • 也许您的文件中有很多双空格?尝试line.split(" +"); 来忽略多个连续空格。
  • 向下到 73946。它也会数数吗?抱歉,我是一名学生,所以 line.split(" +") 之类的变化对我来说是新的。您可以学习方法等,但需要展示的小东西。非常感谢您的帮助。
  • 是的,文本中可能有各种各样的东西,比如省略号、不间断空格、回车、换行和一大堆其他奇怪的字符。也许某处有“。”或者 ” !” (一个意外的空格导致句号或感叹号被算作自己的话)。没有看到文字就很难说。
【解决方案2】:

我有点明白这意味着该对象没有被指向或类似的东西,但我不知道如何修复它。

根本不是这个意思。这意味着您在指向 null 而不是对象的引用上使用了 DOT 运算符(即这里根本没有对象)。

words = line.split(" ");

line 为空,所以调用 line.split 会导致空指针异常。

if(line!=null)
{
    words = line.split(" ");
}

最终的原因是你的 while 循环。

while (in != null) {

应该是

 while ((line=in.readLine()) != null) {

也就是说,循环直到您第一次读取空行。

【讨论】:

  • object that is null 意味着与 object is not being blocked 相同,因此您并没有真正纠正它们。我会说:您正在对空引用调用方法(或访问字段)。
  • @Sotirios Delimanolis,不,不是对象没有被指向,而是对象指向 null。他的解释就像物体在那里但没有被指向一样。该物体并不存在于未指向的边缘。对象没有指向任何东西。
  • 不,那更糟。对象不是指向任何东西的东西。对象不能为空。引用可以为空。变量可以存储空引用。但是对象为 null 是无稽之谈。
  • @Sotirios Delimanolis,我现在还好吗?
  • 是的,我认为这更清晰,技术上也正确。
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多