Java 如何重写我的两个方法,使我不会得到NullPointerException?

Java 如何重写我的两个方法,使我不会得到NullPointerException?,java,nullpointerexception,Java,Nullpointerexception,因此,我的任务是为数组编写两个简单的方法:第一个方法,数组大小的两倍;第二种方法是查找数组中第一个重复字符串的索引。主要方法是我的教授写的,不能修改。我的问题是,在运行代码时,我仍然会得到NullPointerException。我相信这与Arrays.sort()或我老师的主要代码有关,但我被指示:只使用数组(没有其他数据结构),使用Arrays.sort()查找复制的索引,而不修改程序中的任何其他内容……有没有办法按照这些指示重写我的方法 完整代码: import java.io.*; im

因此,我的任务是为数组编写两个简单的方法:第一个方法,数组大小的两倍;第二种方法是查找数组中第一个重复字符串的索引。主要方法是我的教授写的,不能修改。我的问题是,在运行代码时,我仍然会得到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
import java.io.*;
导入java.util.*;
公共课堂实践
{
静态最终int容量=10;
未找到静态最终整数=-1;
公共静态void main(字符串[]args)引发异常
{
如果(参数长度<1)
{
System.out.println(“\n用法:C:\\>java Practice\n\n”);//即C:\>java Lab2 10Kints.txt 172822 words.txt
系统出口(0);
}
字符串[]字列表=新字符串[容量];
int字数=0;
BufferedReader wordFile=new BufferedReader(new FileReader(args[0]));
while(wordFile.ready())//即文件中有另一行(word)时
{if(wordCount==wordList.length)
wordList=upSizeArr(wordList);
wordList[wordCount++]=wordFile.readLine();
}//在wordFile时结束
close();
System.out.format(“%s加载到word数组中。大小=%d,计数=%d\n”,参数[0],字列表。长度,字计数);
int dupeIndex=indexOfFirstDupe(字表,字数);
如果(dupeIndex==未找到)
System.out.format(“在单词列表中找不到重复的值\n”);
其他的
System.out.format(“在索引%d\n处找到的单词列表中的第一个重复值”,dupeIndex);
}//主管道末端
//两种方法
静态字符串[]向上对齐(字符串[]向上对齐)
{
int size=fullArr.length;//查找数组的长度
String[]newsizerr=新字符串[(2*大小)];//创建新数组,大小加倍
对于(int a=0;a
NullPointerException的位置:


编辑:这个问题涉及库代码中的NPE,而不是我自己的代码

根据stacktrace的图像,NPE发生在
数组中。sort()
。虽然没有文档记录(我可以看到),但我认为如果数组包含
null
,则该方法会抛出NPE。它还能合理地做什么?
null
不能在自然顺序中有自然位置,因此包含
null
的数组不能与
Arrays.sort(Object[])
排序

如何修复?我看不出对数组排序的意义,所以您可以省略它。排序意味着返回的第一个副本的索引不是原始数组中的有效索引(从排序之前开始)。但是,如果您的教授坚持,您可以通过适当使用重载的
array.sort(Object[]a,int-fromIndex,int-toIndex)
进行修复,这样您就只能对数组中字符串所在的部分进行排序

我被指示…使用Arrays.sort()查找复制的索引

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

例如:未排序的数组:

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

排序后:

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

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

从错误输出中,您可以看到NPE来自您的indexOfFirstDupe方法。该方法中只有一行可能导致该异常,即索引数组的那一行。嵌套的for从x+1开始,但x将一直递增到数组的末尾。当这种情况发生时,y=size,但是arr[size]不存在,因为索引从0变为size-1。这个问题很容易理解。您首先创建一个大小为10的数组,但如果参数发送到程序的值小于10,则数组中包含
null
,因此
Arrays.sort()
无法执行此任务。当数组大小增加一倍时也会发生这种情况。发生这种情况的原因是
String
的默认值为
null
。对于重复调用,我不同意。链接原文是关于NPE在自己的代码。这个问题是关于库代码深处的未记录NPE。问题是我必须按照教授的要求使用array.sort()。不管怎么说,要绕过这个问题吗?据我所知,您的stacktrace是从Windows中的命令提示符发出的?可以在命令提示下标记(选择)文本并从中复制。因此,最好这样做并将其粘贴到问题中,然后将其格式化为代码,以保留其格式化方式。图像有它的位置,但是文本图像在这里并不流行。啊,那可能有用。但是,既然数组的大小增加了一倍,我怎么知道从哪个索引开始和停止呢?数组大小为“327680”,数组中的字符串为“1728”