Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单java程序不工作--while循环_Java_While Loop - Fatal编程技术网

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

简单java程序不工作--while循环,java,while-loop,Java,While Loop,所以我对编程相当陌生,我正在做一个简单的练习程序,在字母表中找到字母顺序。这应该很容易…但由于某种原因,当我添加一个while循环时,我得到了一个StringIndexOutOfBoundsException。所以程序在第一次执行它应该执行的操作…但是不允许我在没有重新运行程序的情况下再次测试。我测试了while循环,里面只有一个简单的print语句,它工作了,所以我不明白为什么while循环不能与我的字母表程序一起工作 任何帮助都将不胜感激 谢谢 如果字符串为空,则位置0处将没有字符。在执行c

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

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


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

之前检查它是
响应的长度
null
还是
?如果是,您将无法在索引0处获取
char
,您访问字符串索引的唯一位置是
if(response.charAt(0)='n')
,因此这很可能是您的问题所在

if(response.length() > 0 && response.charAt(0) == 'n')
我们应该做到这一点

编辑:
正如@TreySchroeder所指出的,你的程序还有一个问题,那就是你一开始没有读完整的一行。将
放入.readLine()
在.read()中的字母=(char)之后,并使用此修复程序解决另一个问题。

我敢打赌,罪魁祸首是您在
要再次播放吗?
提示下按了“回车”键。.readLine()中的
返回不带尾随换行符的行(请参见),这意味着如果只按“enter”键,它将返回一个空字符串,因此在检查第一个字符时将返回StringOutOfBoundException

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

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

当您为原始字符按enter键时,该换行符仍在缓冲区中,因为您只调用read(),只获取1个字符,而不按enter键将换行符留在缓冲区中。因此,当您调用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;
    }

}

将避免异常。

异常发生在哪一行?第25行似乎是problem@ThisBetterWork请更精确地标记它。因为字符串响应设置为从键盘读入…我以为程序会在该点停止,并等待输入响应…为什么它只是绕过该行?它会停止,但是如果你点击回车键,它会返回空字符串,你会在缓冲区中从原始字符中得到一个额外的换行符。如果键入“a”并按enter键,则缓冲区中有“a”。read()只是读取一个字符,所以在te缓冲区中仍然有一个换行符,所以当您调用readLine()时,它将一直读取到换行符,它将返回一个空字符串,而不是阻塞输入。虽然这将防止抛出异常,但并不能解决实际问题。是的,我认为您是对的。这是有道理的。谢谢:)编辑:虽然我并没有在提示后立即按回车键……所以我认为这实际上可能是因为以前按过回车键。好的,我知道现在发生了什么。我通常不使用read(),但eclipse建议允许我在readLine()不使用的情况下读入一个字符……但实际上我只需要在readLine的末尾使用.charAt(0)。谢谢你的帮助。:)@NominSim已编辑,以防止仅按enter键导致异常
if(response.length() > 0 && response.charAt(0) == 'n')
    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;
    }

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