简单的java输入问题

时间:2010-01-06 07:56:27

标签: java

我是java新手并且在输入时遇到问题。 这是我的代码,似乎根据需要获得第一个输入,但然后跳过接下来的两个“读取”函数调用?

有什么建议吗?

     //  open up standard input
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int battMax, battMin, numNodes=0;
    System.out.print("Enter minimum battery level:");
    try {
         battMin = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter maximum battery level:");
     try {
        battMax = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter number of nodes required:");
     try {
        numNodes = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

3 个答案:

答案 0 :(得分:6)

br.read()将会读取一个字符。此外,如果您正在阅读System.in,那么当用户按下返回时,它可能只会看到某些内容 - 此时,如果您使用的是Windows,则会有额外的\r和{{1在Unix上读取(或只是\n)。

我怀疑您会发现第二个和第三个\n来电所读取的值为read()\r

此外,你实际上并没有获得你想要的值 - 如果有人输入'1'那么你将获得49的值,因为那是该角色的Unicode值。

您应该使用readLine()一次读取一行(然后使用Integer.parseInt()解析字符串。或者,您可以使用Scanner类 - 我不能说我我曾经自己使用它,但可能对你有用。

最后,代码中有很多重复 - 我建议你通过创建一个实用程序方法来重构它。例如,您可能有:

\n

然后您可以非常轻松地使用它:

public static int promptUserForInt(String prompt, int defaultValue,
                                   BufferedReader reader)
    throws IOException
{
    while (true)
    {
        System.out.print(prompt);
        try
        {
            String line = reader.readLine();
            return Integer.parseInt(line);
        }
        catch (NumberFormatException e)
        {
            // Adjust as appropriate...
            System.out.println
                ("Unable to parse input; please enter an integer.");
        }
    }
}

您可以通过引入BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int battMax = promptUserForInt("Enter minimum battery level:"); int battMin = promptUserForInt("Enter maximum battery level:"); int numNodes = promptUserForInt("Enter number of nodes required:"); Writer来显示提示,从而进一步重构 - 这样您就可以更轻松地对其进行测试。

最后,我建议你不要在BufferedWriter的catch块中包含每个位;如果您无法读取控制台输入,我怀疑您不想继续,所以无论第一个输入是生成此异常还是第二个或第三个输出,您都希望表现相同。声明您的方法抛出IOException,或者在同一个IOException块中包含所有三行,由相同的try块处理。

答案 1 :(得分:3)

br.read()读取一个字符。使用Integer.parseInt(br.readLine()),它将读取整行并将其转换为int

另外,初始化所有局部变量:

int battMax=0, battMin=0, numNodes=0;

答案 2 :(得分:0)

如果您使用的是Java 1.5或更高版本,则可以使用java.util.Scanner

public static getInt(String prompt){
    int n = 0;
    try {
        System.out.print(prompt);
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt();
    }
    catch(Exception ex){
       ex.printStackTrace();
    }
    return n;
}

样本用法:

int battMax = getInt("Enter minimum battery level:");
int battMin = getInt("Enter maximum battery level:");
int numNodes = getInt("Enter number of nodes required:");