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;
}
答案 0 :(得分:0)
在public static int getPointsStrikeSpare(int i, char[] inputChars)
方法的不同位置,正在访问不属于数组长度边界的元素。考虑代码块:
if(inputChars[i+1] == '-')
以及
if(inputChars[i+2] == '-') {
在i == inputChars.length - 1的情况下,i+1
和i+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
你在这里得到了一般的想法。