我有一段代码可以扫描大量数字(作为整数)并将它们存储到场景对象中。然而,在我到达第3499个对象(它打印第3498个J)后,它会以空指针崩溃。我找了一个最大的阵列大小但在互联网上找不到任何东西,除了2 ^ 32-5但是我甚至没有接近那个限制。
in1scan = new Scanner(in1);
in2scan = new Scanner(in2);
scenario[] ret= new scenario[9999];
int j=0;
while (in1scan.hasNext()){
String[] input=(in1scan.next().split(",", 16));
ret[j]=new scenario();
for (int i=0; i<16;i++){
ret[j].input[i]=Integer.parseInt((input[i]));
}
j++;
}
j=0;
while (in2scan.hasNext()){
ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong
j++;
System.out.println(j);
}
有人知道出了什么问题吗?是的,我知道我可以使用nextInt而不是当前迂回接受数字的方式,但我将添加一些额外的功能,需要以这种方式处理它。
答案 0 :(得分:6)
你已经“失控”了。
在代码的这一部分中,您可以创建in1scan.size()
ret
元素
while (in1scan.hasNext()){
String[] input=(in1scan.next().split(",", 16));
for (int i=0; i<16;i++){
ret[j]=new scenario();
ret[j].input[i]=Integer.parseInt((input[i]));
}
j++;
}
在这里,您使用in2scan.size()
的第一个ret
元素。如果in2scan.size() > in1scan.size()
,则ret[j]
将为空,因此无法调用.correct
j=0;
while (in2scan.hasNext()){
ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong
j++;
System.out.println(j);
}
在调试器中单步执行(希望)确认此
答案 1 :(得分:1)
堆栈跟踪告诉您
抛出异常 ret[j].correct=Integer.parseInt(in2scan.next()); //here things go wrong
因此ret
,ret[j]
或in2scan
为空。
要找出它是什么,请为NullPointerException设置一个异常断点,并以调试模式运行该程序。这将在抛出异常时暂停执行,允许您在那时检查程序状态。
答案 2 :(得分:1)
i<16
应为i < input.length
。由于`split(..,16)仅指定最大值