我试图按字母顺序对名称列表进行排序,并在线程“main”java.lang.NullPointerException中不断收到错误Exception,我不知道为什么。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class alphabeticalOrder {
static String names[];
static int count = 0;
static String sorting;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String[] names = new String[500];
File namesFile = new File("names.txt");
Scanner inputFile = new Scanner(namesFile);
while (inputFile.hasNextLine()) {
String line = inputFile.nextLine();
String[] namesDetails = line.split(" ");
names[count] = namesDetails[0];
count++;
}
sort();
System.out.println(Arrays.toString(names));
}
public static void sort() {
int namesLength = names.length;
for (int i = 0; i < namesLength - 1; i++) {
for (int j = 0; j < namesLength - 1; j++) {
if (names[j].compareTo(names[j - 1]) > 0) {
sorting = names[j - 1];
names[j - 1] = names[j];
names[j] = sorting;
}
}
}
}
}
客户txt有这些名称
Smith, Alexandra
Downes, Trish
Akbal, Maria
并且数组必须等于500
答案 0 :(得分:1)
更改
if (names[j].compareTo(names[j - 1]) > 0) {
到
if (names[j] != null && names[j].compareTo(names[j - 1]) > 0) {
恼人的空指针异常将消失。
如果你已经克服了对你的500字符串阵列的困扰,我建议你尝试使用TreeSet,因为它会为你完成所有的排序工作。
public static void main(String[] args)
{
Set<String> alphabetical = new TreeSet<String>();
alphabetical.add("A");
alphabetical.add("Z");
alphabetical.add("M");
System.out.println(alphabetical);
}
输出:[A,M,Z]
答案 1 :(得分:0)
您的names
数组有500个元素,其中大部分都是null。当您致电NullPointerException
获取空引用时,这就是您获得names[j].compareTo()
的原因。
您应该只尝试对输入的名称进行排序。
而不是
int namesLength = names.length;
尝试
int namesLength = count;
由于count
包含您实际拥有的输入数量。
BTW,你的sort()方法有其他问题:
j < namesLength
names [j-1]
会给你ArrayIndexOutOfBoundsException
醇>
答案 2 :(得分:0)
您拥有大小为500
的数组,并且您的名称为6
。
当您为数组的前六个索引分配六个名称时,其余索引仍具有null
值。因此,与空值进行比较将抛出NullPointerException
。
<强>为什么强>
因为 Java中的对象在第一次定义时按null
值初始化。
建议:
尝试使用缩小和扩展的ArrayList