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