0

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 条件并输出No valid input. Please try again。我认为这是因为有旧的输入(例如换行符)到处乱飞。我怎样才能清理它?

4

2 回答 2

1

看来问题是您的输入序列:

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

于 2013-05-13T14:30:33.720 回答
0

一段时间后,我最终自己发现并重写了代码。它现在看起来如下并且完美地工作(至少对我来说):

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;
    }

我现在经常使用它们,但我仍然只是一个初学者,所以我可能会再次重写它们。

于 2013-06-01T11:58:43.423 回答