Java BufferedReader读取旧的输入

Java BufferedReader读取旧的输入,java,newline,inputstream,bufferedreader,Java,Newline,Inputstream,Bufferedreader,这里是Java初学者。为了进行测试,我创建了自己的输入类,它使用BufferedReader。代码如下所示: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class inputter { private static BufferedReader read = new BufferedReader(new InputStream

这里是Java初学者。为了进行测试,我创建了自己的输入类,它使用BufferedReader。代码如下所示:

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;

public class inputter {

    private static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    /**
     * @param
     * A reader for chars
     * @throws IOException 
     */
    public static char getChar() throws IOException{
        int buf= read.read();
        char chr = (char) buf;
        while(!Character.isLetter(chr)){
            buf= read.read();
            chr = (char) buf;
        }
        return chr;
    }

    /**
     * @param currencies, names
     * A reader for Ints
     * @throws IOException 
     * 
     */public static int getInt()throws IOException{
        String buf = read.readLine();
        while(!buf.matches("[-]?(([1-9][0-9]*)|0)")){
            buf = read.readLine();
            System.out.print("No valid input. Please try again.");
        }
        return Integer.parseInt(buf);
    }

     /**
         * @param currencies, names
         * A reader for Floats
         * @throws IOException 
         * 
         */
    public static float getFloat()throws IOException{
        String buf = read.readLine();
        while(!buf.matches("[-]?(([1-9][0-9]*)|0)(\\.[0-9]+)?")){
            System.out.print("No valid input. Please try again.\n");
            buf = read.readLine();
        }
        return java.lang.Float.parseFloat(buf);
    }

}

它的问题是,每当我读取一个字符,然后尝试读取一个整数,它就会跳转到else条件并输出
无有效输入。请重试
。我认为这是因为有旧的输入(例如换行符)四处飞舞。我该如何清理它?

问题似乎在于您的输入顺序:

尝试输入以下顺序:“a1[输入]”。您的代码应该适用于这种输入。但是,如果您输入“a[enter]1[enter]”,您的代码将失败。
原因是[enter]键仅在执行下一个readline()时处理,它与数字格式不匹配,因此进入else状态

过了一会儿,我终于自己找到了答案,重新编写了代码。它现在看起来如下所示,并且工作得非常完美(至少对我来说):


我现在经常使用这两种代码,但我还只是一个初学者,所以我可能会再次重写它们。

您试过调试代码吗?我认为问题在于,不能将字符串(->char[])转换为char。可能读取缓冲区包含不可打印的字符?我不认为这是问题所在,因为它可以正常工作多次,并且当我只处理float和int时会打印错误消息。您如何输入?你输入的是“a”[输入键]“1”[输入键]?等等!typecast和类Float或Integer的解析方法之间有很大的不同!我知道。也许我不明白你的意思@法兰,是的,我就是这么做的。谢谢你的努力,但这不是问题所在。我找到了被窃听的序列。问题是新行仍保留在缓冲区中。while序列后面的一个简单read.readLine()完成了任务。public static char getChar()抛出IOException{String buf=read.readLine();char chr=(char)buf.charAt(0);while(buf.length()
public static char getChar() throws IOException{ 
    String buf= read.readLine(); 
    char chr = (char) buf.charAt(0); 
    while(buf.length() <= 1 && !Character.isLetter(chr)){ 
        System.out.println("This is not valid input. Please try again."); 
        buf= read.readLine(); 
        chr = (char) buf.charAt(0); 
    } 
    read.readLine(); 
    return chr; 
}
public static char getChar() throws IOException{
        int buf= read.read();
        char chr = (char) buf;
        while(!Character.isLetter(chr)){
            buf= read.read();
            chr = (char) buf;
        }
        return chr;
    }