【发布时间】:2017-12-24 18:54:52
【问题描述】:
class A {
public static void main (String[] args) {
// code ...
System.out.println(B.fun1());
// code ...
}
class B {
// code ...
public int fun1(){
return C.fun2();
}
class C {
// code ...
public int fun2() {
int u = 0;
for(int k= 0; arr[k] != null ; k++,System.out.println("k="+k)) {
int a = arr[k].getVal();
String s = Integer.toString(a);
if (s.equals(("1"))) {
u = u + 10;
} else {
u = u + a;
}
}
return u;
}
}
我有一个与上面所示结构相同的代码,当main 执行时输出是:
k=1
k=2
k=3
fun1 中打印在main 中的返回值u 是:
30 //depends on getVal()
但是在这个输出之后它也显示了这个
k=1
k=2
k=1
k=2
k=1
k=2
我收到了ArrayIndexOutOfBoundsException。这怎么可能?
我的问题是为什么我得到这个 k=1 k=2 k=1 ... 东西
代码:https://drive.google.com/open?id=1aZYv7qqYd1___fXA92lbtLO5WccI9wz6
如何重现:事情是随机的,所以尝试玩几次。
【问题讨论】:
-
请创建一个minimal reproducible example,我们可以运行它来复制问题。
-
可能是因为
arr[k] != null -
arr[k] != null带有超出范围的索引会在大多数语言中导致错误,因为您必须先获取arr[k]才能进行比较。如果 k 索引超出范围则错误。 -
正如@AniketSahrawat 提到的,您没有检查是否超出了
for(..; arr[k] != null; ...)中的数组限制。是什么阻止k超出数组的大小?尝试检查您是否达到数组长度for(...; k < arr.length; ...) -
就像 arr[0]=null; arr[1]=null;... 当我调用它时,它会像 arr[0]=10;arr[1]=7;arr[2]=null,arr[3]=null... 和 i还尝试将 k 限制为数组大小的最大值,例如 ..for(int k= 0; arr[k] != null && k