0

所以我对编程还很陌生,我正在做一个简单的练习程序,可以在字母表中找到字母顺序。这应该很容易......但由于某种原因,当我添加一个 while 循环时,我得到了一个 StringIndexOutOfBoundsException 。所以程序确实第一次做它应该做的......但不允许我在不重新运行程序的情况下再次测试。我测试了 while 循环,里面只有一个简单的 print 语句,它起作用了,所以我很困惑为什么 while 循环不能与我的字母程序一起工作。

任何帮助将不胜感激谢谢!

import java.io.*;
public class test {


    public static void main(String[] args) throws IOException 
    {
        BufferedReader in;
        in = new BufferedReader (new InputStreamReader (System.in));
        boolean again=true;
        String response;

        while (again)
        {

            System.out.println("Enter a letter to find it's order in the alphabet");

            char theLetter = (char) in.read();

            System.out.println(theLetter + " is the " + convertLetter(theLetter) + "th letter of the alphabet");

            System.out.println("want to play again?");

            response = in.readLine();

            if (response.charAt(0)=='n')
            {
                again=false;
            }
        }

        System.out.println("end program");
    }


    public static int convertLetter(char TheLetter)
    {
        //number value 'a'=97
        //number value 'b'=98
        //number value 'c'=99

        //subtracting 'a' from any other number will reveal how many places away that number is from the start
        //thus finding it's chronological place in the alphabet

        int NumberValue= (int)TheLetter;
        int a = 'a';

        int CalulateOrder = (NumberValue - a) + 1; 

        return CalulateOrder;

    }
}
4

6 回答 6

3
 if (response.charAt(0)=='n') 

如果 String 为空"",则位置 0 将没有字符。在执行之前检查它charAt()

于 2012-07-12T18:50:52.147 回答
3

当您按回车键输入原始字符时,该换行符仍在缓冲区中,因为您只调用 read() 并且只获得 1 个字符,而缓冲区中的换行符不会按回车键。因此,当您调用 readLine 时,它​​只会点击该换行符并返回一个空字符串。

您可以通过在第一次询问您输入字符时键入具有多个字符的内容来测试这一点,并且它将进行第二次循环,因为 readLine 将返回一个非空字符串。

要解决此问题,请将您的原始 read() 更改为 readLine() 以便它获取您按 Enter 引起的换行符,然后只需从字符串中获取第一个字符。

这应该解决它:

    import java.io.*;

public class test {

    public static void main(String[] args) throws IOException {
        BufferedReader in;
        in = new BufferedReader (new InputStreamReader (System.in));
        boolean again=true;
        String response;

        while (again) {
            System.out.println("Enter a letter to find it's order in the alphabet");
            response = in.readLine();
            if (response.length() > 0) {
                char theLetter = response.charAt(0);

                System.out.println(theLetter + " is the " + convertLetter(theLetter) + "th letter of the alphabet");
                System.out.println("want to play again?");

                response = in.readLine();
                if (response.length() > 0 && response.charAt(0)=='n') {
                    again=false;
                }
            }
        }
        System.out.println("end program");
    }

    public static int convertLetter(char TheLetter) {
        return (TheLetter - 'a') + 1;
    }

}
于 2012-07-12T19:01:10.317 回答
1

response null或的长度""?如果是,您将无法获得charat index 0

于 2012-07-12T18:51:28.247 回答
1

您访问字符串索引的唯一位置是,if (response.charAt(0) == 'n')所以这很可能是您的问题区域。

if(response.length() > 0 && response.charAt(0) == 'n')

应该做的伎俩。

编辑:正如@TreySchroeder 指出的那样,您的程序还有另一个问题,因为您一开始没有阅读整行。放在in.readLine();您的初始 之后theLetter = (char) in.read();,并将此修复用于其他问题。

于 2012-07-12T18:53:48.660 回答
1

我敢打赌,罪魁祸首是你在want to play again?提示符下点击了“输入”。in.readLine();返回没有尾随换行符的行(请参阅javadocs ,这意味着如果您只按“输入”,它将返回一个空字符串,因此在检查第一个字符时会返回 StringOutOfBoundException。

在检查字符之前检查空字符串:

if(response.length() > 0 && response.charAt(0) == 'n')
于 2012-07-12T18:58:53.910 回答
0
if (response.isEmpty() && response.charAt(0)=='n')

将避免异常。

于 2012-07-12T19:03:35.040 回答