Java String.compareTo错误与nullPointer异常
这里,我有一个对字符串数组进行排序的快速排序,以及它的开始和结束位置 排序(字符串[]s,整数开始,整数结束) 我在读一个普通的文件并试图排序,但它给了我:Java String.compareTo错误与nullPointer异常,java,sorting,nullpointerexception,quicksort,Java,Sorting,Nullpointerexception,Quicksort,这里,我有一个对字符串数组进行排序的快速排序,以及它的开始和结束位置 排序(字符串[]s,整数开始,整数结束) 我在读一个普通的文件并试图排序,但它给了我: java.lang.NullPointerException at java.lang.String.compareTo(String.java:578) at QuickSort.partition(QuickSort.java:21) at QuickSort.sortA(QuickSort.java:7) at WordMat
java.lang.NullPointerException
at java.lang.String.compareTo(String.java:578)
at QuickSort.partition(QuickSort.java:21)
at QuickSort.sortA(QuickSort.java:7)
at WordMatch.read(WordMatch.java:33)
at WordMatch.main(WordMatch.java:73)
转到QuickSort.java:
public class QuickSort
{
static void sortA(String[] s, int start, int end)
{
if (end > start)
{
int pivot = partition(s, start, end);
sortA(s, start, pivot-1);
sortA(s, pivot, end);
}
}
private static int partition(String[] s, int start, int end)
{
String pivot = s[end];
int left = start;
int right = end;
String temp = "";
do
{
while ((s[left].compareTo(pivot) <= 0) && (left < end))
left++;
while ((s[right].compareTo(pivot) > 0) && (right > start))
right--;
if (left < right)
{
temp = s[left];
s[left] = s[end];
s[right] = temp;
}
} while (left < right);
temp = s[left];
s[left] = s[end];
s[end] = temp;
return left;
}
}
公共类快速排序
{
静态无效排序(字符串[]s,整数开始,整数结束)
{
如果(结束>开始)
{
int pivot=分区(s、开始、结束);
排序(s,开始,枢轴-1);
排序(s,枢轴,末端);
}
}
私有静态整型分区(字符串[]s,整型开始,整型结束)
{
字符串轴=s[结束];
int左=开始;
int右=结束;
字符串temp=“”;
做
{
while((s[左]。比较(pivot)0)和&(右>开始))
对--;
if(左<右)
{
温度=s[左];
s[左]=s[结束];
s[右]=温度;
}
}而(左<右);
温度=s[左];
s[左]=s[结束];
s[结束]=温度;
左转;
}
}
但它似乎没有错…调用quicksort
quicksort.sortA(单词列表、开始、编号)似乎有问题代码>。因为在该行之前,循环中增加了number
,这意味着在末尾number
的值增加了。您可以这样尝试quickSort.sortA(单词列表,startN,number-1)代码>
感谢字符串。如果传递了null
,compareTo()
将抛出NPE,这是您必须执行的操作
查看您的代码,您正在传递s[end]
(通过变量pivot
),因此您的数组必须包含null。回溯调用堆栈,我们看到向下传递的数组是wordList
,它的初始化大小为5000000
;除非您的输入中正好有5000000个单词,否则您的代码将抛出异常。。。4999999或更少,您将获得NPE,5000001或更多,您将获得ArrayIndexOutOfBoundsException
我最喜欢的咒语之一就是:不要使用数组强>
使用一个列表
,该列表会根据需要增大,以捕获输入。如果您的算法需要数组,请通过list的toArray()
方法将列表转换为数组,该方法返回的数组大小正好合适。此更改将解决您的问题。也许您可以在失败的行上添加一条注释,以便于帮助您,因为代码中不包含行号可能与感谢重复
public class QuickSort
{
static void sortA(String[] s, int start, int end)
{
if (end > start)
{
int pivot = partition(s, start, end);
sortA(s, start, pivot-1);
sortA(s, pivot, end);
}
}
private static int partition(String[] s, int start, int end)
{
String pivot = s[end];
int left = start;
int right = end;
String temp = "";
do
{
while ((s[left].compareTo(pivot) <= 0) && (left < end))
left++;
while ((s[right].compareTo(pivot) > 0) && (right > start))
right--;
if (left < right)
{
temp = s[left];
s[left] = s[end];
s[right] = temp;
}
} while (left < right);
temp = s[left];
s[left] = s[end];
s[end] = temp;
return left;
}
}