我是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)
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)
你可以通过接受Writer或BufferedWriter显示提示进一步重构- 这样你就可以更容易地测试它.
最后,我建议你不要在catch块中包含每个位IOException; 如果您无法读取控制台输入,我怀疑您不想继续,所以无论第一个输入是生成此异常还是第二个或第三个输出,您都希望表现相同.声明您的方法抛出IOException,或者同一个try块中的所有三行都由同一个块处理catch.
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |