我是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();
}
答案 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:");