简单的java输入问题

Mei*_*eir 1 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();
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

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

我怀疑你会发现你的第二次和第三次read()通话读取的值是\r\n.

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

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

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

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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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:");
Run Code Online (Sandbox Code Playgroud)

你可以通过接受WriterBufferedWriter显示提示进一步重构- 这样你就可以更容易地测试它.

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