接收文件并按字母顺序排列 Java:NullPointer 异常

Taking in a File and Alphabetizing it in Java: NullPointer Exception

我正在尝试读取文件并按字母顺序排列名称。该文件包含名字和姓氏列表,例如:

Bob Flower
Tina Sea
Krusty Crab
Mark Klutz

我想使用冒泡排序对字符串进行字母排序。我不断收到一条错误消息:

java.lang.NullPointerException
    at java.lang.String.compareTo(Unknown Source)
    at BubbleSort.Alphabetize(BubbleSort.java:48)
    at BubbleSort.main(BubbleSort.java:31)

我目前的代码是:

import java.util.*;
import java.io.*;

public class BubbleSort
{
    public static void main(String[] args)
        throws IOException
    {
        File inData = new File("names.txt");
        if (!inData.exists()) {
            System.out.println("File does not exist");
            System.exit(0);
        }

        Scanner input = new Scanner(inData);
        int x = 0;
        String[] name = new String[30];
        //String[] extra = new String[30];

        while (input.hasNext()) {
            name[x] = input.next();
            input.nextLine();

            // extra[x] = input.next();
            // System.out.println(name[x]);
            x++;
        }

        BubbleSort sorter = new BubbleSort();
        sorter.Alphabetize(name, x);

        for (int i = 0; i < x; i++) {
            System.out.println(name[i]);
        }
        input.close();
    }

    private static void Alphabetize(String[] array, int a)
        throws IOException
    {
        String temp;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j].compareTo(array[j + 1]) > 0) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
}

我不明白如何解决这个错误,或者真正的问题是什么。

我猜 String[] name = new String[30]; 包含空元素。在您的示例中,只有 8 个字符串

Bob Flower

Tina Sea

Krusty Crab

Mark Klutz

但是您创建了一个包含 30 个元素的数组。结果,数组中将有 8 个 String 个对象和 22 个 null 个对象。 稍后在 array[j].compareTo(array[j + 1]) 中比较有效的 String 对象和 null。尝试使用 ArrayList 而不是 String[].

您正在对未使用(因此为空)的数组元素进行排序。在整个排序方法中,您应该使用 a 而不是 array.length。这就是 a 的目的。

不是 - 您正在访问超过数组长度大小的空数组元素。当你在最后访问数组[j + 1]时,它是空的。

      if (array[j].compareTo(array[j + 1]) > 0) { <- culprit here

您在分配内存(数组)和使用计算出的索引访问元素时遇到问题。因此,您在访问未初始化的元素时遇到问题,或者另一次您可能会遇到 IndexOutOfBoundExceptions。作为一个初学者,在低水平上学习和做它可能会有所帮助,但为了你的兴趣我想分享一点,也可能有助于不要讨厌 Java.

文件 class 是旧的,尝试使用 Java 7.

附带的 NIO.2

对于更高层次的抽象,这里有一个单行排序解决方案:

Files.readAllLines(Paths.get("names.txt"))
     .stream().filter(p -> p.length() > 0)
     .forEachOrdered(System.out::println);

它甚至可以在 JShell(Java 9) 中试用。

Files.readAllLines(Paths.get("names.txt"))
     .stream().filter(p -> p.length() > 0)
     .sorted()
     .toArray(String[]::new);

输出:

{ "Bob Flower", "Krusty Crab", "Mark Klutz", "Tina Sea" }