繁体   English   中英

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

[英]How to rewrite my two methods so I do not get a NullPointerException?

因此,我的任务是为数组编写两个简单的方法:第一个方法,将数组的大小加倍; 第二种方法,找到数组中第一个重复字符串的索引。 主要方法是我的教授写的,不得更改。 我的问题是我在运行我的代码时继续收到 NullPointerException。 我相信它与 Arrays.sort() 或我老师在 main 中的代码有关,但我被指示:只使用数组(没有其他数据结构),使用 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 的位置:

在此处输入图片说明

编辑:这个问题解决了库代码中的 NPE,而不是我自己的代码。

根据堆栈跟踪的图像,NPE 发生在Arrays.sort() 虽然没有记录(我可以看到),但我相信如果数组包含null ,则此方法会抛出 NPE 。 它还能做什么? null在自然顺序中不能有自然位置,因此包含null的数组不能用Arrays.sort(Object[])排序。

怎么修? 我看不出对数组进行排序的意义,因此您可以将其省略。 排序意味着第一个重复项的返回索引不是原始数组的有效索引(从排序之前)。 但是,如果您的教授坚持,您可以通过适当使用重载的Arrays.sort(Object[] a, int fromIndex, int toIndex)来修复Arrays.sort(Object[] a, int fromIndex, int toIndex)这样您只需对字符串所在的数组部分进行排序。

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

编辑:如果您只需要查找任何重复项, Arrays.sort()可以提供帮助。 排序后,您知道任何重复项最终都在数组中,彼此并排。 所以现在你只需要将每个元素与下一个元素进行比较,而不是与数组的所有其他元素进行比较,以确定是否存在重复项,如果有则查找一个。 但是,通常已排序数组中的第一个副本与未排序数组中的第一个副本不同。

例如: 未排序数组:

    ["pig", "cow", "queen", "cow", "bee", "bee"]

第一个副本: cow cow第一个索引:1。

排序后:

    ["bee", "bee", "cow", "cow", "pig", "queen"]

第一个副本: bee bee第一个索引:0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM