String.compareTo与nullPointer异常的错误

时间:2014-07-27 22:52:11

标签: java sorting nullpointerexception quicksort

这里,我有一个quickSort,它对String数组进行排序以及它的开始和结束位置 sortA(String [] s,int start,int end)

String[] wordlist = new String[5000000];
QuickSort quickSort = new QuickSort();
int number = 0, startN = 0;

 public void read() throws IOException
{
   Scanner keyboard = new Scanner(System.in);
   System.out.println("Please enter the name of the file you want to read from");
   String readFile = keyboard.nextLine();
   try
   {
     Scanner sc2 = null;
     sc2 = new Scanner(new File(readFile));
     startN = number;
     while (sc2.hasNextLine())
     {
        Scanner s2 = new Scanner(sc2.nextLine());
        boolean b;
        while (b = s2.hasNext())
        {
           String s = s2.next();
           s = s.replaceAll("[^A-Za-z]","");
           wordlist[number] = s;
           number++;
           System.out.println(s + "|" +number);
        }
     }
     quickSort.sortA(wordlist, startN, number);
   }
   catch(FileNotFoundException e)
   {
      System.out.println("File not Found, please try again");
   }
}

我正在读取普通文件并尝试排序,但它给了我:

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;
  }
}

但它似乎没有错......

2 个答案:

答案 0 :(得分:1)

如果传递String.compareTo()

null会抛出一个NPE,这就是你必须要做的事情。

查看代码,您正在传递s[end](通过变量pivot),因此您的数组必须包含null。追溯调用堆栈,我们看到传递的数组是wordList,其初始化大小为5000000;除非你的输入中有完全 5000000个单词,否则你的代码会抛出异常... 4999999或更少,你会得到一个NPE,5000001或更多,你会得到一个ArrayIndexOutOfBoundsException。

我最喜欢的一句咒语捕获了补救措施:不要使用数组!

使用大小越来越大的List<String>来捕获输入。如果您的算法需要一个数组,请通过List的toArray()方法将列表转换为数组,该方法返回一个大小合适的数组。此更改将解决您的问题。

答案 1 :(得分:0)

调用快速排序quickSort.sortA(wordlist, startN, number);似乎有问题。由于在该行之前,您在循环中增加了number,这意味着最后number具有增加的值。您可以尝试这样quickSort.sortA(wordlist, startN, number-1);

由于