这是对现有文件的内容进行排序的代码:
public void sortFile(String fileName)throws IOException
{
FileReader fin=new FileReader("C:\\File Handling\\"+fileName+".txt");
BufferedReader bin=new BufferedReader(fin);
String[] str=new String[100];
int i=0;
while((str[i]=bin.readLine())!=null)
i++;
Arrays.sort(str); //getting a NullPointerException here
FileWriter fout=new FileWriter("C:\\File Handling\\"+fileName+".txt");
BufferedWriter bout=new BufferedWriter(fout);
PrintWriter pout=new PrintWriter(bout);
for(i=0;i<str.length;i++)
pout.println(str[i]);
}
但是,在IDE中执行代码时,我得到的是java.lang.NullPointerException
有人可以告诉我为什么会这样吗?我无法理解。
答案 0 :(得分:6)
你应该尝试:
Arrays.sort(str, 0, i);
数组包含空字符串,这会导致NullPointerException。
答案 1 :(得分:0)
这只是因为你从声明一个100个位置数组开始,然后你只填充一些(每行一个,直到文件有行),然后你扫描所有100个位置。
正如其他人已经指出的那样,当你到达位置i时,Arrays.sort()在null元素上调用compare()来执行第一次扫描
str[i] == null
然后你得到错误,因为在数组项上调用str [i] .compare()为null。
要解决这个问题,您应该保存数组中放置的行数,然后排序/循环直到该位置。 顺便说一句,当你正在阅读文件时,你已经在i变量中拥有它,只需存储它。
int i=0;
int lineNumber=0;
while((str[i]=bin.readLine())!=null) {
lineNumber = i++;
}
PS请使用括号,它们将帮助您阅读和避免问题:)
答案 2 :(得分:0)
您预先定义了100个大小的String数组,默认情况下将所有100个元素初始化为null。现在,如果你说你的文件中有4行,那么其余的96个元素将为null,并且只会初始化你的4个元素。然后当你对该数组进行排序时,你会得到NullPointerException。
这里有两个选项:
从String数组更改为List并使用api,如:
Collections.sort(...);//pass your list
或者使用数组你可以使用api:
Arrays.sort(String array, startIndex, end Index);
所以在这里你可以传递yoru数组,其中0作为起始索引而i作为结束索引。但是你在这里不必要地浪费空间。