简单的java程序不工作 - while循环

时间:2012-07-12 18:47:18

标签: java while-loop

所以我对编程很新,我正在研究一个简单的练习程序,它在字母表中找到一个字母顺序。这本来应该很简单......但是由于某些原因,当我添加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;

    }
}

6 个答案:

答案 0 :(得分:3)

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

如果字符串为空"",则位置0处不会有字符。在执行charAt()

之前检查它

答案 1 :(得分:3)

当您按Enter键输入原始字符时,该换行符仍然在缓冲区中,因为您只调用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;
    }

}

答案 2 :(得分:1)

response null还是""的长度?如果是,你将无法获得索引0的char

答案 3 :(得分:1)

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

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

应该做的伎俩。

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

if (response.isEmpty() && response.charAt(0)=='n')

将避免例外。