【问题标题】:Switch statement inside for loop does not increment "i" correctlyfor 循环内的 switch 语句没有正确递增“i”
【发布时间】:2016-01-27 22:34:36
【问题描述】:

我有以下代码:

String everything = sb.toString(); //stores all the data from the input file into a string
String replaceAll = everything.replaceAll("\\s", "");
int charCount = replaceAll.length(); //charCount is 147
char arr[] = replaceAll.toCharArray();
for (int i = 0; i < arr.length; i++) {
    switch (arr[i]) {
        case 'E': {
            fridge[Character.getNumericValue(arr[(i + 1)])].is_empty();
        }
        break;
        case 'F': {
            fridge[Character.getNumericValue(arr[(i + 2)])].find_it(Character.getNumericValue(arr[(i + 1)]));
        }
        break;
        case 'C': {
            fridge[Character.getNumericValue(arr[(i + 3)])].combineFridge(fridge[Character.getNumericValue(arr[(i + 2)])], fridge[Character
                                                                                                                                          .getNumericValue(arr[(i + 1)])]);
        }
        break;
        case 'M': {
            fridge[Character.getNumericValue(arr[(i + 3)])].commonItems(fridge[Character.getNumericValue(arr[(i + 2)])], fridge[Character
                                                                                                                                        .getNumericValue(arr[(i + 1)])]);
        }
        break;
        case 'I': {
            fridge[Character.getNumericValue(arr[(i + 2)])].insertItem(Character.getNumericValue((i + 1)));
        }
        break;
        case 'D': {
            fridge[Character.getNumericValue(arr[(i + 2)])].delete_item(Character.getNumericValue((i + 1)));
        }
        break;
        case 'O': {
            fridge[Character.getNumericValue(arr[(i + 1)])].outputRefrigerator();
        }
        break;

    }
}

char 数组有 147 个元素,每个字母后面都有一个数字。 每个字母激活一个方法,后跟 1-3 个参数(数字)。 然而,在 for 循环中,我得到一个 -1 值,有时是随机的大数字(我的所有数字都是正数且小于 12)。

如果我手动调用 for 循环之外的任何方法,例如: fridge[Character.getNumericValue(arr[0].insertItem(Character.getNumericValue(arr[1]);,一切正常,arr[1](即 1)的值存储在 this.fridgeItems(一个 int[] 数组)。

为什么会这样?我知道这是 switch 语句或 for 循环的问题,但我无法确定。

【问题讨论】:

  • 假设 arr[0] 是一个操作码,arr[1]arr[3] 是它的参数。你期望i 从 0 直接跳到 4 吗?您每次只将其增加 1。
  • 没有代码在switch语句中来实际增加i
  • switch 语句中所有大括号的意义何在?
  • 为什么要创建数组 arr ?为什么不只是switch(replaceAll.charAt(i))
  • 上帝帮助任何不得不维护此代码的可怜人。

标签: java for-loop switch-statement


【解决方案1】:

检查您的指数。在您的代码中,您通过i + 1i + 2 索引访问来自arr 的元素。如果您的循环迭代次数超过n - 2 次,您将遇到 IndexOutOfBoundException。

顺便说一句,您需要在 switch 语句中增加 i 以跳过输入数组中的“已使用”字符。

【讨论】:

    【解决方案2】:

    您的代码是“未正确递增 i,因为 switch 语句中没有代码实际递增 i

    你应该这样做:

    case 'C':
        fridge[Character.getNumericValue(arr[i + 3])]
                .combineFridge(fridge[Character.getNumericValue(arr[i + 2])],
                               fridge[Character.getNumericValue(arr[i + 1])]);
        i += 3;
        break;
    

    【讨论】:

    • 并且在访问 arr[i+3] 之前,您应该检查以确保 i+3
    • @FredK 仅当您想要更好的错误输入错误消息时才需要。如果你这样做了,你还应该检查Character.getNumericValue() 没有返回负值,或者一个超过fridge 大小的值。是否改进错误消息完全取决于 OP。
    • @C.Suarez 好的,给我们看看everything(或replaceAll)的值,从而更接近于创建a Minimal, Complete, and Verifiable example,我们或许可以为您提供帮助。或者,如果您遇到错误,请显示它。 --- 当我说向我们展示时,我的意思是编辑问题并添加信息。
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 2015-04-21
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多