接收文件并按字母顺序排列 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" }
我正在尝试读取文件并按字母顺序排列名称。该文件包含名字和姓氏列表,例如:
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" }