Java 为什么在下面的代码中会出现NullPointerException?

Java 为什么在下面的代码中会出现NullPointerException?,java,nullpointerexception,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;

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

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]);
}
public void sortFile(字符串文件名)引发IOException
{
FileReader fin=新的FileReader(“C:\\File Handling\\”+fileName+“.txt”);
BufferedReader bin=新的BufferedReader(fin);
字符串[]str=新字符串[100];
int i=0;
而((str[i]=bin.readLine())!=null)
i++;
Arrays.sort(str);//在此处获取NullPointerException
FileWriter fout=新的FileWriter(“C:\\File Handling\\”+fileName+“.txt”);
BufferedWriter bout=新的BufferedWriter(fout);
PrintWriter pout=新的PrintWriter(布特);
对于(i=0;i您应该尝试:

Arrays.sort(str, 0, i);
数组包含空字符串,这些字符串会导致NullPointerException。

您应该尝试:

Arrays.sort(str, 0, i);

数组包含空字符串,这些字符串导致NullPointerException。

这只是因为您首先声明一个100位数组,然后只填充一些(每行一个,直到文件有行),然后扫描所有100位

正如其他人已经指出的,第一次扫描是由Arrays.sort()在到达位置i时调用null元素上的compare()

 str[i] == null 
然后,由于对空数组项调用str[i].compare(),您将收到错误

要解决这个问题,您应该保存数组中放入多少行的计数,然后只需排序/循环直到该位置。 顺便说一句,在读取文件时,它已经存在于i变量中,只需存储它即可

int i=0;
int lineNumber=0;
while((str[i]=bin.readLine())!=null) {
    lineNumber = i++;
}

请使用括号,它们将帮助您阅读和避免问题:)

这只是因为您首先声明一个100位数组,然后只填充一些(每行一个,直到文件有行),然后扫描所有100位

正如其他人已经指出的,第一次扫描是由Arrays.sort()在到达位置i时调用null元素上的compare()

 str[i] == null 
然后,由于对空数组项调用str[i].compare(),您将收到错误

要解决这个问题,您应该保存数组中放入多少行的计数,然后只需排序/循环直到该位置。 顺便说一句,在读取文件时,它已经存在于i变量中,只需存储它即可

int i=0;
int lineNumber=0;
while((str[i]=bin.readLine())!=null) {
    lineNumber = i++;
}

PS请使用括号,它们将在阅读和避免问题方面帮助您很多:)

您预先定义了大小为100的字符串数组,默认情况下将所有100个元素初始化为null。现在,如果您说文件中有4行,那么其余96个元素将为null,只有您的4个元素将被初始化。然后对该数组进行排序时,会得到NullPointerException

这里有两个选项:

将字符串数组更改为列表并使用api,如:

Collections.sort(...);//pass your list
Arrays.sort(String array, startIndex, end Index);
或者使用数组,您可以使用api,如:

Collections.sort(...);//pass your list
Arrays.sort(String array, startIndex, end Index);

因此,在这里,您可以将0作为开始索引传递给yoru数组,而将i作为结束索引传递给yoru数组。但是,您在这里浪费了不必要的空间。

您预先定义了大小为100的字符串数组,默认情况下,该数组将所有100个元素初始化为null。现在,如果您说文件中有4行,那么其余96个元素将为null,并且只有文件中的4个元素s将被初始化。然后,当您对该数组进行排序时,将得到NullPointerException

这里有两个选项:

将字符串数组更改为列表并使用api,如:

Collections.sort(...);//pass your list
Arrays.sort(String array, startIndex, end Index);
或者使用数组,您可以使用api,如:

Collections.sort(...);//pass your list
Arrays.sort(String array, startIndex, end Index);

因此,在这里,您可以将0作为开始索引传递给YRU数组,而将i作为结束索引传递给YRU数组。但是您在这里浪费了不必要的空间。

哪一行出现异常?在哪一行出现错误?当您尝试使用
数组按自然顺序排序时,您的数组可能包含初始化为
null
的字符串。排序
内部类似于
a.compareTo(b)
将被使用。如果
a
null
将抛出
NullPointerException
。哪一行出现异常?哪一行出现错误?数组可能包含初始化为
null
的字符串。当您尝试使用
数组按自然顺序排序时。sort
internall将使用类似
a.compareTo(b)
的内容。如果
a
null
a
NullPointerException
将抛出。此信息不正确。当存在null元素时,它将打印null。System.out.print函数打印null?:obj.toString()@n如果你说得对,我就更改了答案,只留下了解决问题的方法。并将正确的一点归功于其他人。此信息不正确。当存在null元素时,它将打印null。System.out.print函数打印null?“null”:obj.toString()@如果你是正确的,我更改了答案,只留下了解决问题的方法。并将正确的答案归功于其他人。谢谢你的回答。我的程序的排序功能现在可以工作了。谢谢你的回答。我的程序的排序功能现在可以工作了。