我是编程中的菜鸟。 我想为prog编写代码,要求用户输入值,直到输入一个整数。
public class JavaApplication34 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int flag = 0;
while(flag == 0) {
int x = 0;
System.out.println("Enter an integer");
try {
x = sc.nextInt();
flag = 1;
} catch(Exception e) {
System.out.println("error");
}
System.out.println("Value "+ x);
}
}
}
我认为代码是正确的,如果我输入的不是整数,它应该让我再次输入值。 但当我运行它,并说我进入xyz 它迭代无限时间而不要求我输入值。
test run :
Enter an integer
xyz
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
Enter an integer
error
Value 0
答案 0 :(得分:5)
当扫描程序抛出InputMismatchException时,扫描程序不会 传递导致异常的令牌。
因此sc.nextInt()
再次读取相同的令牌并再次抛出相同的异常。
...
...
...
catch(Exception e){
System.out.println("error");
sc.next(); // <---- insert this to consume the invalid token
}
答案 1 :(得分:2)
在错误情况下,您需要清除您输入的字符串(例如,通过nextLine
)。由于nextInt
无法返回,因此扫描仪仍处于待处理状态。您还希望将输出值的行移动到 try
,因为您在发生错误时不想这样做。
这些方面的东西:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int flag = 0;
while(flag == 0)
{
int x = 0;
System.out.println("Enter an integer");
try
{
x = sc.nextInt();
flag = 1;
System.out.println("Value "+ x);
}
catch (Exception e){
System.out.println("error");
if (sc.hasNextLine()) { // Probably unnecessary
sc.nextLine();
}
}
}
}
附注:Java有boolean
,没有必要使用int
作为标志。所以:
boolean flag = false;
和
while (!flag) {
和
flag = true; // When you get a value
答案 2 :(得分:2)
您可以更改逻辑,如下所示:
int flag = 0;
int x = 0;
String str="";
while (flag == 0) {
System.out.println("Enter an integer");
try {
str = sc.next();
x = Integer.parseInt(str);
flag = 1;
} catch (Exception e) {
System.out.println("Value " + str);
}
}
这里我们首先从Scanner读取输入,然后我们尝试将其解析为int,如果输入不是整数值则会抛出异常。如果出现异常,我们会打印用户输入的内容。当用户输入一个整数时,它将成功解析,flag的值将更新为1,这将导致循环退出。
答案 3 :(得分:0)
this问题的答案可能会对您有所帮助
它使用扫描仪.hasNextInt()
功能!