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