这是用于计算保龄球得分的代码,我需要帮助解决此错误:

线程“主”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0

这是我的输入(我将其存储在名为bowling.txt的文本文件中)。

0 4 5 3 4 2 4 4 3 5 0 8 3 1 2 1 6 4 3 4

0 P 5 3 4 2 4 4 3 5 0 8 3 1 2 1 6 4 3 4

游戏有10帧,每帧有2次尝试,所以我认为我在文本文件中需要20个数字(分数)。

这就是我得到的:

The score is 66
The score is 77
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(Unknown Source)
    at pin.main(pin.java:77)


N.B:对于所有有用的答案,我都会给+1!

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class pin
{
    static String tries;
    public static int value(int index)
    {
        int i = 0;
        if (tries.charAt(index) == 'T')
            i = 10;
        else if (tries.charAt(index) == 'P')
            i =10 -(tries.charAt(index-2)-'0');
        else
            i = tries.charAt(index)-'0' ;
        return i;
    }

    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        int score = 0;
        int frameIndex;
        int i = 0;
        FileReader fr = new FileReader("C:/Users/PC4599/Desktop/programming/bowling.txt");
        BufferedReader br = new BufferedReader(fr);
        tries = br.readLine();

        while (tries != null)
        {
            score = 0;
            frameIndex = 0;
            i = 0;
            while (frameIndex != 10)
            {
                if (tries.charAt(i)=='T') //Strike
                {
                    score =(score + 10 + value(i + 2) + value(i + 4));
                    i = i + 2;
                }
                else if (tries.charAt(i+2)=='P') //Spare
                {
                    score =(score + 10 + value(i + 4));
                    i = i + 4;
                }
                else
                {
                    score =(score + (tries.charAt(i)-'0') + (tries.charAt(i + 2)-'0'));//Neither Strike nor Spare
                    i = i + 4;
                }
                frameIndex = frameIndex + 1;

            }

            System.out.println("The score is "+score);
            tries = br.readLine();
        }
        br.close();
        fr.close();
    }
}

最佳答案

看来while (tries != null)循环正在运行3次。输入文件的末尾可能会有多余的一行,可能只是空白。

在给定数据输入格式的情况下,最小正确的分数行将包含23个字符(用空格分隔12个罢工),因此您可以将该检查更改为while ((tries != null) && (tries.length() >= 23))之类的东西。那应该可以解决这个问题,并且无论如何看起来都是一件很合理的事情。 (如果我不记得如何正确打保龄球,则可以进行适当的调整。)

10-05 18:51