【问题标题】:How to handle invalid input when using Scanner.nextInt()使用 Scanner.nextInt() 时如何处理无效输入
【发布时间】:2016-08-08 13:12:07
【问题描述】:

我是一个初学者,我编写了一个 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);
}
}
}
}
}

【问题讨论】:

  • 问题标题的糟糕选择。建议将其更改为您的具体问题。除此之外,您的问题实际上缺少问题部分。
  • 我的程序没有正确显示平均值、最大值和最小值。而且我还想使用 try catch 来缓存错误。例如:当用户输入字符串而不是整数时。请帮帮我。
  • @Sufyan 请编辑您问题的标题和描述
  • @C-Otto 好的,很抱歉给您带来不便。

标签: java


【解决方案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...

【讨论】:

  • 输入错误,我认为您的意思是尝试读取 n 时出现在行尾的 '\n' 。否则,将在尝试读取 n 的下一次迭代中读取该 '\n'。
【解决方案2】:

你可能想要

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

在 while 循环内,因为现在您只检查最后读取的值(此外,在循环外无需增加计数器(在您读取 -5 之后,顺便说一句,为什么 -5?o.O)。

此外,您可能希望以这种方式初始化最小值/最大值,因为如果您的最小值大于 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
}

正如其他人指出的那样,如果您希望平均值不被截断,请将 sum 加倍:((double) sum) / count

最后,但也是最重要的一点:先尝试自己调试,然后再询问其他人。

【讨论】:

【解决方案3】:

试试这个:

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. 我已经捕获了所有可能的错误,所以您应该不会看到任何错误消息

注意:这个已经测试过了

【讨论】:

  • 非常感谢您的帮助。最好的问候。
【解决方案4】:

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

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

【讨论】:

  • 我移动了右括号和一个计数++,但代码仍然无法正确显示平均值、最大值和最小值。你能编辑我的代码并为我添加try catch吗? @FruBlom
  • 查看 Joop Eggens 的答案。 double 具有您所需的小数,整数只是整数。
【解决方案5】:
    //count++;
    double avg = 0.0;
    if (count != 0) {
        avg = ((double) sum) / count;
    }
    System.out.println("Average : " + avg);

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

因此我们一侧,这里的sum 转换为浮点数:

(double) sum

然后它就起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多