Java 修复NullPointerException
我正在编写代码来读取文本文件并计算文本文件中的所有单词。但是在while循环中,字符串数组得到一个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
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+这样的小变化对我来说是新鲜事。你可以学习一些方法之类的东西,但是你需要展示一些小东西。所以谢谢你的帮助。是的,文本中可能有各种各样的东西,比如省略号,不间断空格,回车,换行符,还有一大堆其他奇怪的字符。也许在某个地方。或一个偶然的空格,使句号或感叹号被算作它们自己的单词。如果看不到文本,就很难说了。