java - 简单的java输入问题

标签 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();
    }

最佳答案

br.read() 将读取单个字符。此外,如果您从 System.in 中读取,它可能只会在用户按下 return 时看到一些东西 - 此时,如果您使用的是 Windows,它将有一个额外的 \r\n 来读取(或者在 Unix 上只是 \n)。

我怀疑您会发现第二次和第三次 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.");
        }
    }
}

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

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:");

您可以通过采用 WriterBufferedWriter 来进一步重构来显示提示 - 这样您就可以更轻松地对其进行测试。

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

关于java - 简单的java输入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2011573/

相关文章:

java - 从字符串中获取整数值并将其加倍

java - Lucene:根据相关性进行搜索和检索

java - 将 JSON 解析为自定义 ArrayList,只返回最后一项?

java - for 循环中缺少 return 语句

java - 如何知道创建了多少个动态控件?

java - 关于二维数组

java - 强制 JVM 使用特定密码进行 https 连接

java - 为什么方法中的 if-else if-else(在循环内)给出 "return statement missing"而所有 if-else 分支都有返回语句?

java - 如何使用 javax.ws.rs.* 和 Glassfish 从 GET HTTP 方法检索参数?

java - 如何在 Java 中解码 DER 编码的字符串?