为什么我在以下代码中得到NullPointerException?

时间:2014-11-15 09:10:38

标签: java nullpointerexception

这是对现有文件的内容进行排序的代码:

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

有人可以告诉我为什么会这样吗?我无法理解。

3 个答案:

答案 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作为结束索引。但是你在这里不必要地浪费空间。