当用户输入是小浮点数时,扫描仪会抛出

时间:2018-06-16 19:46:08

标签: java input java.util.scanner

我正在处理一个项目,并且我发现了一个错误,这个错误一直是我以前的一些任务中反复出现的问题。基本上,我有一个方法,提示用户输入,然后返回该值。我检查以确保用户输入的值大于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)

我试过关闭扫描仪,但这也会导致错误......有人可以帮我理解发生了什么吗?我想提示用户输入一个有效的整数,如果输入有效,则继续提示。

谢谢!

3 个答案:

答案 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;
}