使用Scanner.nextInt()时如何处理无效输入

时间:2016-08-08 13:12:07

标签: java

我是初学者,我写了一个java程序,允许你输入n个数字,它只显示最大值,最小值和平均值,如果输入数字-5,我的程序没有正确显示,我需要一些帮助。我想在输入字符串而不是整数时使用try / catch来捕获错误。

        import java.util.Scanner;
public class Average{
public static void main(String[]args){

System.out.print("Enter any integer numbers or -5 to quit:");
        Scanner scan =new Scanner(System.in);
    double avg = 0.0;
    int number = -1;
    double avg = 0.0;
    double sum = 0;
    int count = 0; 
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;

    try {
    while((scan.nextInt())!= -5)
       {
     if (count != 0) {
        avg = ((double) sum) / count;
    count++;
    }   
         if (number > max){
        max = number;
        }
        if(number < min){
       min = number;
        }
        catch (InputMismatchException e) {
      System.out.println("please enter only integer numbers");

    System.out.println("Average : " + avg); 
    System.out.println("maximum : " + max);
    System.out.println("minimum : " + min);
}
}
}
}
}

5 个答案:

答案 0 :(得分:1)

你可能想要

if(number > max) {
    max = number;
}
if(number < min) {
    min = number;
}

在while循环中,因为现在你只是检查最后一个读取值(同样,没有必要在循环之外启动计数器(在你读完-5之后,顺便说一下,为什么-5?oO) )。

此外,您可能希望以这种方式初始化最小值/最大值,因为如果您的最小值大于0,则代码输出0.如果您的最大值低于0,则相同:

int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;

对于非整数部分:读取异常并使用try-catch块来捕获InputMismatchException。

try {
    //while(scan.nextInt) here
} catch (InputMismatchException e) {
    //Do something here, like print something in the console
}

正如其他人所指出的那样,如果你想要平均值不被截断,则将总和加倍:((double) sum) / count

最后,但最重要的是:在问别人之前先尝试自己调试一下。

答案 1 :(得分:1)

试试这个:

import java.util.Scanner;

public class Average {

static Scanner scan;

public static void main(String[] args) {
    System.out.println("Enter any integer numbers or -5 to quit:");
    scan = new Scanner(System.in);
    int number = -1, sum = 0, count = 0;
    int max = 0;
    int min = 0;
        while((number = scanNextInt()) != -5) {
            count++;
            sum = sum + number;

            if(number > max) {
                max = number;
            }

            if(number < min) {
                min = number;
            }
        }
            if(number == -5) {
                try {
                    System.out.println("Average : " + (sum / count));
                    System.out.println("Maximum : " + max);
                    System.out.println("Minimum : " + min);
                }catch(Exception e) {
                    //Error printing, so quit the program.  Look below.
                }
                //Quit
                System.exit(0);
            }
        scan.close();
    }
    static int scanNextInt() {
        try {
        return scan.nextInt();
        }catch(Exception e) {
            //Stop the program if the user inputs letters / symbols
            System.out.println("Invalid Number.");
            return -5;
        }
    }
}

我做出的改变:
1.我创建了一个名为scanNextInt()的方法,如果可能的话,返回scan.nextInt()。如果它会导致错误,则返回-5以停止程序 2.我在while循环中包含了两个if语句,因此它们实际上有效 3.我已经发现了所有可能的错误,因此您不应该看到任何错误消息

注意:此HAS已经过测试

答案 2 :(得分:1)

要在循环中获取整数输入,响应“退出”值,并防止无效输入,我会使用类似下面的模板。

请注意,至关重要的是,到目前为止,没有一个答案提到,仅仅抓住InputMismatchException是不够的。您还必须调用扫描仪对象的nextLine()方法来清除缓冲区中的错误输入。否则,错误输入将在无限循环中重复触发相同的异常。您可能希望根据具体情况使用next(),但要知道像this has spaces这样的输入会产生多个异常。

<强>代码

package inputTest;

import java.util.Scanner;
import java.util.InputMismatchException;

public class InputTest {
    public static void main(String args[]) {
        Scanner reader = new Scanner(System.in);

        System.out.println("Enter integers or -5 to quit.");

        boolean done = false;
        while (!done) {
            System.out.print("Enter an integer: ");
            try {
                int n = reader.nextInt();
                if (n == -5) {
                    done = true;
                }
                else {
                    // The input was definitely an integer and was definitely 
                    // not the "quit" value.  Do what you need to do with it.
                    System.out.println("\tThe number entered was: " + n);
                }
            }
            catch (InputMismatchException e) {
                System.out.println("\tInvalid input type (must be an integer)");
                reader.nextLine();  // Clear invalid input from scanner buffer.
            }
        }
        System.out.println("Exiting...");
        reader.close();
    }
}

示例

Enter integers or -5 to quit.
Enter an integer: 12
    The number entered was: 12
Enter an integer: -56
    The number entered was: -56
Enter an integer: 4.2
    Invalid input type (must be an integer)
Enter an integer: but i hate integers
    Invalid input type (must be an integer)
Enter an integer: 3
    The number entered was: 3
Enter an integer: -5
Exiting...

答案 3 :(得分:0)

首先 - 您需要在最小数字检查后移动while循环的结束括号,以允许对您读取的每个数字执行检查。并删除一个计数++以避免重复计算。

要忽略非法输入,您可以使用其他Scanner方法之一并读取String而不是int,然后尝试Integer.parseInt String并将解析包装到try catch中。

答案 4 :(得分:0)

    //count++;
    double avg = 0.0;
    if (count != 0) {
        avg = ((double) sum) / count;
    }
    System.out.println("Average : " + avg);

当除法的两边都是int时,它是一个整数除法(结果int,其余部分被抛弃)。

因此我们强制转换一边,这里sum为浮点数:

(double) sum

然后它有效。