迭代数组

时间:2015-10-12 16:56:50

标签: java arrays loops for-loop

public static int calcScore(char[] inputChars) {
    int gameScore = 0;
    for(int i = 0; i < inputChars.length; i++) {
        System.out.println(inputChars[i]);
        if(inputChars[i] == 'X') {
            gameScore += 10;
            gameScore += getPointsStrikeSpare(i, inputChars);
        } else if (inputChars[i] == '-') {
            gameScore += 0;
        } else if (inputChars[i] == '/') {
            gameScore += 10;
            gameScore += getPointsStrikeSpare(i, inputChars);
        } else {
            gameScore += Character.getNumericValue(inputChars[i]);
        }
    }
    return gameScore;
}

所以我的问题是我想通过 inputChars 数组(使用 .toCharArray()创建)并且它工作正常但它无法处理最后一个字符。

以下是输入变量的内容:“X- / X5-8 / 9-X811-4 / X”。

inputChars 是input.toCharArray()。

以下是运行代码时的输出:

X
-
/
X
5
-
8
/
9
-
X
8
1
1
-
4
/
X
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
    at betterCalculateScore.getPointsStrikeSpare(betterCalculateScore.java:37)
    at betterCalculateScore.calcScore(betterCalculateScore.java:20)
    at betterCalculateScore.main(betterCalculateScore.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我尝试过使用 i&lt; inputChars.length - 1 但是它只是不计算最后一个字符。

以下是 getPointsStrikeSpare 的内容:

    public static int getPointsStrikeSpare(int i, char[] inputChars) {
    int points = 0;

    if(inputChars[i] == 'X') {
        if(inputChars[i+1] == '-') {
            points += 0;
        } else if (inputChars[i+1]== '/') {
            points += 10;
        } else {
            points += Character.getNumericValue(inputChars[i+1]);
        }
        if(inputChars[i+2] == '-') {
            points += 0;
        } else if (inputChars[i+2]== '/') {
            points += 10;
        } else {
            points += Character.getNumericValue(inputChars[i+2]);
        }
    } else {
        if(inputChars[i+1] == '-') {
            points += 0;
        } else if (inputChars[i+1]== '/') {
            points += 10;
        } else {
            points += Character.getNumericValue(inputChars[i+1]);
        }
    }
    return points;
}

2 个答案:

答案 0 :(得分:0)

public static int getPointsStrikeSpare(int i, char[] inputChars)方法的不同位置,正在访问不属于数组长度边界的元素。考虑代码块:

    if(inputChars[i+1] == '-') 

以及

    if(inputChars[i+2] == '-') {

在i == inputChars.length - 1的情况下,i+1i+2都超过了数组长度,因此java.lang.ArrayIndexOutOfBoundsException异常。

答案 1 :(得分:0)

一般来说,如果&#39; i&#39;等于或小于(array_size - 1)的长度,a [i]有效。

但是,在这种方法中,public static int getPointsStrikeSpare(int i, char[] inputChars)可以看到[i + 1]和[i + 2]最终在if-else结构中的不同代码路径中被查询。所以,如果你的'我'索引已经到达数组的末尾,这将是Out of Bounds。

Ex:X-/X5-8/9-X811-4/X 这个大小是18.因此,引用的合法值是0-17,即[0]到[17],因为数组中的索引从0开始。到程序结束时,索引计数器&# 39; I&#39;变成17岁。

if(inputChars[i] == 'X') {               // VALID
        if(inputChars[i+1] == '-') {     // INVALID
            points += 0;
        } else if (inputChars[i+1]== '/') {  // INVALID
            points += 10;
        } else {
            points += Character.getNumericValue(inputChars[i+1]); // INVALID
        }
        if(inputChars[i+2] == '-') { // INVALID

你在这里得到了一般的想法。