我正在处理一个项目,并且我发现了一个错误,这个错误一直是我以前的一些任务中反复出现的问题。基本上,我有一个方法,提示用户输入,然后返回该值。我检查以确保用户输入的值大于0并且我的代码按预期工作除了非常小的负或正浮点值接近0.现在,我相信它是因为我设置此用户的变量输入是一个整数,所以当值是浮点数时它会抛出...虽然我可能完全错了,但我仍然很陌生。
以下是用户输入代码:
public static int userNumber(){
Scanner input = new Scanner(System.in);
int n = 0;
while(n <= 0){
System.out.println("Please enter a positive integer");
n = input.nextInt();
}
return n;
}
这是用户输入0.1523156时返回的错误: 0.1523156
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at Lab5.userNumber(Lab5.java:22)
at Lab5.main(Lab5.java:7)
我试过关闭扫描仪,但这也会导致错误......有人可以帮我理解发生了什么吗?我想提示用户输入一个有效的整数,如果输入有效,则继续提示。
谢谢!
答案 0 :(得分:3)
使用hasNextInt()。
int n=0;
Scanner input = new Scanner(System.in);
while(!input.hasNextInt() && n <= 0) {
System.out.println("Please enter a positive Integer.");
input.next();
}
n = input.nextInt();
System.out.println(n);
input.close();
答案 1 :(得分:2)
只有在您确定用户只输入int时才应使用nextInt()
。根据方法的javadoc,如果输入的值无法解析为int:
InputMismatchException - if the next token does not match the Integer regular expression, or is out of range
您应该使用next()
来为您提供字符串,然后尝试解析它,直到您获得有效的int。
public class InputRead {
public static void main(String[] args){
System.out.println("UserNumber entered:" + userNumber());
}
public static int userNumber(){
Scanner input = new Scanner(System.in);
int n = 0;
while(n <= 0){
try{
System.out.println("Please enter a positive integer");
String read = input.next();
n = Integer.parseInt(read);
} catch(NumberFormatException e){
//ignore
}
}
input.close();
return n;
}
}
<强>更新强>
使用hasNextInt()
的解决方案:
public class InputIntRead {
public static void main(String[] args){
System.out.println("UserNumber entered:" + userNumber());
}
public static int userNumber(){
try (Scanner scanner = new Scanner(System.in)) {
String msg = "Please, enter a positive integer:";
int n = 0;
while(n <= 0){
System.out.println(msg);
if(scanner.hasNextInt()){
n = scanner.nextInt();
} else {
scanner.next();
}
}
return n;
}
}
}
答案 2 :(得分:2)
Scanner.nextInt()
不匹配,则 InputMismatchException
会引发Integer
。
作为一个选项,在扫描输入之前,您可以使用Scanner.hasNextInt()
方法检查输入是否有效Integer
。
示例:
try (Scanner sc = new Scanner(System.in)) {
String msg = "Please, enter a positive Integer:";
int n = 0;
do {
System.out.println(msg);
// make the user keep entering the input until it's an Integer
while (!sc.hasNextInt()) {
System.out.println(msg);
sc.next();
}
n = sc.nextInt();
}
while (n <= 0); // run until the input is a positive Integer
return n;
}