Java 修复NullPointerException

Java 修复NullPointerException,java,arrays,string,nullpointerexception,Java,Arrays,String,Nullpointerexception,我正在编写代码来读取文本文件并计算文本文件中的所有单词。但是在while循环中,字符串数组得到一个NullPointerException。我有点理解,这意味着物体没有被指向或沿着这些线,但我不知道如何修复它 public class W273 { public static void main(String[] args) throws IOException { while (JPL.test()) { String fileName = "p

我正在编写代码来读取文本文件并计算文本文件中的所有单词。但是在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);
        }
    }
}
我有点理解,这意味着物体没有被指向或沿着这些线,但我不知道如何修复它

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);
        }
    }
}
这根本不是这个意思。这意味着您在指向null而不是对象的引用上使用了点运算符,即这里根本没有对象

words = line.split(" ");
line为null,因此调用line.split会导致null指针异常

if(line!=null)
{
    words = line.split(" ");
}
最终的原因是你的while循环

while (in != null) {
应该是

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

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

您的程序可能需要一些重构。以下是我可能的做法:

最小化字段声明。您不需要行或词的初始定义

小心溪流。当读取文件时出现异常时,您应处理:

try {
    in = new BufferedReader(new FileReader(fileName));
接下来,赋值行并检查赋值运算符的结果是否为null。当文件中没有更多行时,测试将失败,循环将退出

    while ((line = in.readLine()) != null) {
您可以在一行中递增计数。您似乎没有对循环或单词进行任何操作,所以现在我在这个示例中省略了这一点

        count += line.split(" ").length;
    }
无论如何都要关闭缓冲读取器!然后退出

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

我打赌这不是你的NPE发生的地方。我在这里看到一个无限循环…你的意思是当线的时候!=无效的另外,您可能希望查看do{}while测试;结构您可以消除多余的线的初始捕获。请发布完整的堆栈跟踪。将其编辑到问题中。@owlstead:该问题是针对OP的,在while循环中的任何位置都不能为null。对象为null表示没有指向与对象相同的对象,因此您没有在那里真正更正它们。我会说:您正在调用一个方法或访问一个空引用上的字段。@Sotirios Delimanolis,不,不是对象没有被指向,而是对象指向空。他的解释就像物体在那里,但没有被指向。这个物体不在没有被污染的边缘的某个地方。物体没有指向任何东西。不,那更糟。物体不是指向任何东西的东西。对象不能为空。引用可以为null。变量可以存储空引用。但是一个空的对象是胡说八道的。@Sotirios Delimanolis,我现在有的是好的吗?是的,我认为这更清楚,技术上也更正确。太棒了,谢谢你,效率更高了。只是一个问题:如果计数是76403,但我知道它实际上应该是73057,那么您认为代码会有什么问题?可能您的文件中有很多双空格?试试line.split+;改为忽略多个连续空格。减至73946。它也会数数吗?对不起,我是一个学生,所以像line.split+这样的小变化对我来说是新鲜事。你可以学习一些方法之类的东西,但是你需要展示一些小东西。所以谢谢你的帮助。是的,文本中可能有各种各样的东西,比如省略号,不间断空格,回车,换行符,还有一大堆其他奇怪的字符。也许在某个地方。或一个偶然的空格,使句号或感叹号被算作它们自己的单词。如果看不到文本,就很难说了。