for循环在java中表现不同

时间:2017-12-24 18:54:53

标签: java for-loop output

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

u中打印的来自fun1的返回值main是:

30  //depends on getVal()

但在此输出之后它也会显示此

k=1
k=2
k=1
k=2
k=1
k=2

我收到ArrayIndexOutOfBoundsException。这怎么可能? 我的问题是为什么我得到这个k = 1 k = 2 k = 1 ...的事情 CODE:https://drive.google.com/open?id=1aZYv7qqYd1___fXA92lbtLO5WccI9wz6 如何重现:事情是随机的,所以尽量多玩几次。

2 个答案:

答案 0 :(得分:1)

for(int k= 0; arr[k] != null ; k++,System.out.println("k="+k)) {

你对k的高度没有约束,而只是在你被发现为null之前进行评估。超出索引值将抛出IndexOutOfBoundsException而不是求值为空值,因此如果数组中没有空值,则总会遇到异常,除非出现其他一些打破循环的方式。为了防止这种情况,您可以检查以确保在进行空检查之前k在数组长度内。

for(int k= 0; k < arr.length && arr[k] != null ; k++,System.out.println("k="+k)) {

答案 1 :(得分:0)

原始代码为here

看看你的整个代码我猜测如何删除控制台输出中的额外数字,我做了一些改动,使你的代码更有效率。如果这是您问题的最终解决方案,请告诉我。

首先,我删除了循环中的System.out.Println(k),消除了控制台输出中的最后一个额外数字:

public int evaluateHand() {
    int u = 0;
    try {
        for(int k= 0; hand[k] != null; k++) {
            int a = hand[k].getRank();
            String ok = Integer.toString(a);
            if (ok.equals(("13"))) {
                u = u + 10;
            }else if (ok.equals(("12"))) {
                u = u + 10;
            } else if (ok.equals(("11"))) {
                u = u + 10;
            } else if (ok.equals(("1"))) {
                u = u + 11;
            } else {
                u = u + a;
            }
        }