当前位置: 首页 > 知识库问答 >
问题:

使用扫描仪时如何处理无效输入。nextInt()

江航
2023-03-14

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

共有3个答案

凌俊材
2023-03-14

试试这个:

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。我已经将这两个if语句包含在当循环中,因此它们实际上可以工作。
3。我已经捕获了所有可能的错误所以您不应该看到任何错误消息

:这已经过测试

红砚文
2023-03-14

你可能会想要

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块来捕获InputMismatchExc0019。

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

正如其他人指出的那样,如果您不想截断平均值,请将sum转换为double:((double)sum)/count

最后,但最重要的是:在问别人之前,试着自己调试它。

姜增
2023-03-14

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

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

代码

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...
 类似资料:
  • 我正在尝试通过单行输入检索用户输入:例如,使用扫描仪分隔符为Comma5,6,4,8,9。如何使用这种类型的输入检索任意数量的整数?也就是说,不必询问用户希望输入多少个整数。下面是我一直在使用的代码,但是当我想中断时,不能中断while循环。请注意,我保留System.Out以跟踪程序当前运行的位置。令人困惑的是,我可以以这种格式获得用户输入,但程序停止并再次要求用户输入,然后如果输入是一个整数,

  • 问题内容: 请问我关于扫描仪的问题;我在一家小公司工作;我们有一个软件;它生成一个大文本文件;而且我们必须从中得到一些有用的信息; 我想用Java编写一个简单的应用程序以节省时间;你能指导我吗? 例如我要这个输出; 输出量 RFID:25蓝色:562 WifiID:2610 RFID:33 RFID数量:2 例如;这是我的文本文件,因为使用我们的软件生成的每个文件都有14000行:) 我用此源代码

  • 我正在创建一个用于处理用户输入的类。这样,在其他项目中,我可以从类中调用方法,而不必担心在每个新项目中创建扫描程序。 类中将有一个单独的方法来处理不同的变量类型(float、int、String等)。我从浮动类型开始: 这个方法工作得很好,只是它必须在else部分返回一个float。在本例中,它是一个零,因此当输入到计算器(例如)时,零会导致任何输出等于零。 有没有返回空浮点值的方法来克服这个问题

  • 所以,我被这段代码困住了: 这是我的输出: 插入一个整数:< br >无效值!< br >插入一个整数:< br >无效值!< br >...

  • 对于作业,我必须编写以下代码: 当我尝试编译它时,它在命令提示符下给了我3个错误,说“无法解析符号,符号:类扫描仪,位置:类单词,扫描仪用户输入=新扫描仪(System.in)”。我不确定错误在哪里。我应该使用BufferedReader作为输入吗?

  • 问题内容: 我正在尝试让扫描仪在循环中进行输入。一旦用户想要完成操作,他就可以退出此循环。我尝试了许多不同的方法来执行此操作,但始终存在一些问题。这是代码: 上面代码的问题(在我尝试的其他方法上也会发生)是,当用户键入 Y时 ,将跳过名字的第一个输入,并跳转到姓氏。如果用户键入 N, 则循环将正确停止。有人可以解释发生这种情况的原因,以及如何克服使用课堂的问题? ps:执行类似的操作,将导致循环终