如何重写我的两个方法,以便不出现NullPointerException?

时间:2018-10-07 04:27:51

标签: java nullpointerexception

因此,我的任务是为数组编写两个简单的方法:第一个方法,将数组的大小加倍;第二个方法,将数组的大小加倍。第二种方法,找到数组中第一个重复字符串的索引。主要方法是由我的教授编写的,不得更改。我的问题是,在运行代码时,我继续收到NullPointerException。我认为这与Arrays.sort()或我的老师的主代码有关,但我被指示:仅使用数组(不使用其他数据结构),使用Arrays.sort()查找重复对象的索引,以及不修改程序中的任何其他内容...有什么办法可以按照这些说明重写我的方法?

完整代码:

import java.io.*;
import java.util.*;

public class Practice
{
    static final int CAPACITY = 10;
    static final int NOT_FOUND = -1;
    public static void main (String[] args) throws Exception
    {
        if (args.length < 1 )
        {
            System.out.println("\nusage: C:\\> java Practice <words filename>\n\n"); // i.e. C:\> java Lab2 10Kints.txt 172822words.txt
            System.exit(0);
        }


    String[] wordList = new String[CAPACITY];
    int wordCount = 0;
    BufferedReader wordFile = new BufferedReader( new FileReader(args[0]) );

    while ( wordFile.ready() ) // i.e. while there is another line (word) in the file
    {   if ( wordCount == wordList.length ) 
            wordList = upSizeArr( wordList );
        wordList[wordCount++] = wordFile.readLine();
    } //END WHILE wordFile
    wordFile.close(); 
    System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[0],wordList.length,wordCount );
    int dupeIndex = indexOfFirstDupe( wordList, wordCount );
    if ( dupeIndex == NOT_FOUND )
        System.out.format("No duplicate values found in wordList\n");
    else
        System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

} // END OF MAIN

// TWO METHODS 

static String[] upSizeArr( String[] fullArr )
{

    int size = fullArr.length; //find the length of the arrays
    String[] newSizeArr = new String[(2 * size)]; // creates new array, doubled in size
    for (int a = 0; a < size; a++) {
        newSizeArr[a] = fullArr[a];
    }
    return newSizeArr;

}
static int indexOfFirstDupe( String[] arr, int count )
{       
    Arrays.sort(arr);
    int size = arr.length;
    int index = NOT_FOUND;

    for (int x = 0; x < size; x++) {
        for (int y = x + 1; y < size; y++) {
            if (arr[x].equals(arr[y])) {
                index = x;
                break;
            }
        }
    }
    return index;
}
} // END OF PROGRAM

NullPointerException的位置:

enter image description here

编辑:此问题针对库代码中的NPE,而不是我自己的代码。

1 个答案:

答案 0 :(得分:0)

根据堆栈跟踪的图像,NPE发生在imports: [ .... TranslateModule ], 内部。尽管没有记录(我可以看到),但我相信如果数组包含Arrays.sort(),则此方法将引发NPE。它还能合理地做什么? null不能自然顺序排列,因此包含null的数组不能用null排序。

如何解决?我看不到对数组进行排序的含义,因此您可以将其省略。排序意味着返回的第一个重复项索引不是对原始数组的有效索引(从排序之前开始)。但是,如果您的教授坚持认为,则可以通过适当地使用重载的Arrays.sort(Object[])来解决问题,因此您只需对字符串所在的数组部分进行排序。

  

我被指示……使用Arrays.sort()查找被骗对象的索引

编辑:如果您只需要查找任何重复项,Arrays.sort(Object[] a, int fromIndex, int toIndex) 可以提供帮助。排序后,您知道所有重复项都将最终排在阵列中,彼此相邻。因此,现在您只需要将每个元素与数组中的下一个元素进行比较,而不是与数组中的每个其他元素进行比较,即可确定是否存在重复项,并找到是否存在重复项。但是,通常排序数组中的第一个重复项将与未排序数组中的第一个重复项不同。

例如:未排序的数组:

Arrays.sort()

第一个副本: ["pig", "cow", "queen", "cow", "bee", "bee"] cow的第一个索引:1。

排序后:

cow

第一个副本: ["bee", "bee", "cow", "cow", "pig", "queen"] bee的第一个索引:0。