Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.compareTo错误与nullPointer异常_Java_Sorting_Nullpointerexception_Quicksort - Fatal编程技术网

Java String.compareTo错误与nullPointer异常

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

这里,我有一个对字符串数组进行排序的快速排序,以及它的开始和结束位置 排序(字符串[]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 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;
  }
}