我无法弄清楚如何在Java中修复nullpointererror

时间:2014-03-12 03:32:22

标签: java arrays nullpointerexception binary-search selection-sort

我正在编写一个程序,它接收一个文件并将其内容写入数组。然后使用选择排序算法对数组进行排序,然后使用二进制搜索算法进行搜索。该数组不能超过100个元素,我不能使用用户定义的类。

/*Griffen Fox
  CS 110
  Assignment 5
  Question 1
*/
import java.util.Scanner;
import java.io.*;
public class WordsSearchProgram
{
   public static void main(String[] args)throws IOException
   {
      //Loads Words.txt to an array
      final int SIZE = 100; //Size of the array
      String[] words = new String[SIZE]; // creates the array
      int index = 0; // Loop Control Variable

      //Opens the File
      File file = new File("words.txt");
      Scanner inputFile = new Scanner(file);

      //Reads Contents Into Array
      while (inputFile.hasNext() && index < words.length)
      {
         words[index] = inputFile.nextLine();
         index++;
      }

      //Close File
      inputFile.close();
      int search;
      for (index = 0; index < words.length; index++)  
      {  
         search = searchString(words, words[index]);  

         if (search >= 0) 
         {  
            System.out.println(words[index] + " is at index " + search);  
         }  
         else 
         {  
            System.out.println(words[index] + " is not in the array.");  
         }  
       }  
    }
    //Selection Sort Algorithm
    public static String[] sort(String[] words)
    {
      for (int i = words.length - 1; i >= 1; i--)
      {
       // Find the maximum in the list[0..i]
       String  currentMax = words[0];
       int currentMaxIndex = 0;

         for (int j = 1; j <= i; j++)
         {
            if (currentMax.compareTo(words[j]) < 0) 
            {
               currentMax = words[j];
               currentMaxIndex = j;
            }
         }

       // Swap list[i] with list[currentMaxIndex] if necessary;
       if (currentMaxIndex != i) 
       {
         words[currentMaxIndex] = words[i];
         words[i] = currentMax;
       }

      }
      return words;
      }
      //Binary Search String
      public static int searchString(String[] words, String key) 
      {  
         int first = 0;  
         int last  = words.length;
         int position = -1;
         boolean found = false;  

         while (!found && first <= last)
         {  
            int mid = ((first + last) / 2);  
            if (key.compareTo(words[mid]) == 0) 
            {  
               found = true;
               position = mid;  
            }
            else if (key.compareTo(words[mid]) > 0) 
            {  
               first = mid - 1;  
            } 
            else 
            {  
               first = mid + 1;  
            }   
          }  
         return position;  
      }
} 

4 个答案:

答案 0 :(得分:0)

数组的大小&#34;字&#34;但是你在数组中填入了从&#34; words.txt&#34;。

中读取的单词

如果文件的行少于100,该怎么办?

然后是&#34;单词&#34;的一些元素。将为NULL。

答案 1 :(得分:0)

您的文件少于100行,因此单词[mid]为空!

 if (key.compareTo(words[mid]) == 0) // causes to NullPointErexception

即使你解决了这个问题,上面一行会引发java.lang.ArrayIndexOutOfBoundsException,所以你应该改变很多东西!

要解决此问题,您可以执行此操作:

  ArrayList<String> words = new ArrayList<String>();
  ...
  words.add(inputFile.nextLine());

并从

更改循环条件
while (inputFile.hasNext() && index < words.length)

while (inputFile.hasNext() && index < SIZE)

并使用words简单地获得words.size()的大小。

修改: 您可以轻松地将words传递给sort方法,而不是word[index]使用words.get(index)words.set(index, element)

答案 2 :(得分:0)

在你的第一个while循环中你需要像

这样的东西
while (inputFile.hasNext() && index < words.length)
  {
     words[index] = inputFile.nextLine();
     index++;
     numOfWords = index + 1;
  }

在下面的循环中使用numOfWords变量作为比较,这样你就永远不会到达数组中的一个点,它是NULL

答案 3 :(得分:0)

正如 Mok 所提到的,您需要使用ArrayList而不是数组。此外,必须使用预定义的方法,如equals方法,同时编写代码以避免重新发明轮子,并保持代码bug免费。

使用equals方法

key.equals(words[mid])

在使用null运算符之前检查compareTo值。

if(key!=null && words[mid]!=null && key.compareTo(words[mid]) > 0)

使用arraylist将帮助您解决arrayindexoutofbounds异常