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

在用户输入时验证数据类型

董弘新
2023-03-14

我想在用户使用Scanner输入时验证数据类型(在我的情况下是“int”)。

我在下面写了代码。

    public static void main(String[] args) throws IOException {

    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter size of an array...");
    int n = 0;

     // 1st block, n <= 100
    do {
        System.out.println("Capacity must be less than or equal to 100");
        try {
            n = scanner.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Enter only integers ");
        }
    } while (n > 100);

    int[] arr = new int[n];

    // block 2. Value must be greater than 0 and less than 10000
    for (int i = 0; i < n;) {
        do {
            try {
                arr[i] = scanner.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Enter only integer value");
            }
        } while (arr[i] > 10000 || arr[i] < 1);
        i++;
    }

    scanner.close();

    for (int i = n - 1; i >= 0; i--)
        System.out.println(arr[i]);
    }
}

问题是,在第一个块中,若我给字符,程序终止。“如何在验证失败时保持循环运行??”

在第二个块中,如果我给出非整数,它将无限运行,并显示消息“仅输入整数值”。

从调试中,我得出结论,在不等待输入的情况下,它采用之前提供的最后一个非int值。

为什么编译器取最后一个值??

有什么建议吗?

共有2个答案

鄢翰藻
2023-03-14

作为对davidxxx回答的补充:下面是使用Scanner.hasNextInt()方法的相同代码。

Scanner scanner = new Scanner(System.in);

System.out.println("Enter size of an array...");
while (!scanner.hasNextInt()) scanner.next();
int arrayLength = scanner.nextInt();

int[] arr = new int[arrayLength];

boolean arrayFull = false;
int index = 0;

System.out.println("Enter array values");
while (!arrayFull){
    while (!scanner.hasNextInt()) scanner.next();
    int value = scanner.nextInt();
    if (value < 0 || value > 1000) {
        System.out.println("Enter only integer value < 0 and > 1000");
        continue;
    }
    arr[index++] = value;

    if (index >= arrayLength){
        arrayFull = true;
    }
}
富勇军
2023-03-14

1) 将0指定为用于获取用户输入的ninteger的默认值:int n=0
因此,如果输入触发了输入失配异常,则进入while语句,其中n等于0while(n

>

  • 使用包装器 Integer : Integer n = null;具有可空值的整数可以知道扫描程序中是否未接受任何值

    更改while语句条件以检查您的需求:

    < code>while (n == null || n


    2)对于第一种情况和第二种情况,如果输入与所需的类型不匹配(这里是int值),则不会读取扫描仪中的当前令牌。
    忽略此令牌以避免进入无限循环:

       catch (InputMismatchException e) {
            ...
            scanner.nextLine();
        }
    

  •  类似资料:
    • 问题内容: 我有这样的标记: 我希望在用户在第二个输入中意外键入字母时显示跨度。简单吧?作为(可能)相关的问题,当用户移动第一滑块输入时,第二输入中的值消失。为什么?如果我从标记中删除,则不会发生这种情况。 明确说明:我希望用户在键入工具提示时立即看到错误,而无需执行任何“提交”操作。(我不希望实际上根本不需要使用该元素,但是所有相关的演示似乎都需要它。) http://jsfiddle.net/

    • 问题内容: 我是这个C ++世界的新手,正在尝试为数字密码编写输入验证功能。这是我到目前为止所得到的: 对于不正确的值,它工作得很好,但在有效输入时不会中断循环。知道我在这里缺少什么吗?干杯!! James Kanze脚本的ErroR: 新代码: 使用 和 验证作为字符串 感谢所有人(尤其是James Kanze)的帮助。这件事在这里很有效。 那里还有进一步改进的空间吗?干杯!! 问题答案: 这看

    • 6.1 节创建的用户模型现在已经有了可以使用的 name 和 email 属性,不过功能还很简单:任何字符串(包括空字符串)都可以使用。名字和电子邮件地址的格式显然要复杂一些。例如,name 不应该是空的,email 应该符合特定的格式。而且,我们要把电子邮件地址当成用户名用来登录,那么在数据库中就不能重复出现。 总之,name 和 email 不是什么字符串都可以使用的,我们要对它们可使用的值做

    • 我正在使用IBM沃森助手,并尝试根据时间帧/跨度验证用户输入。我应该使用什么功能? 我正在使用方法来验证用户输入的过去和现在之间的时间框架,但它现在对我有效。如果我现在或今天输入沃森助手仍然认为这是过去... : 看起来“好像你以前想预约。再试一次。”正确的 我预计,如果用户现在或今天的输入可以使预订生效,如果用户输入过去的时间来响应 “就像你过去想预订一样。再试一次。” 所讨论的代码片段如下所示

    • 问题内容: 因此,我几乎搜索了单词“ string”,“ python”,“ validate”,“ user input”等等的每个排列,但是我还没有找到一种适合我的解决方案。 我的目标是提示用户是否要使用字符串“ yes”和“ no”进行另一笔交易,我认为字符串比较在Python中是一个相当简单的过程,但是有些不起作用对。我使用的是Python 3.X,据我所知,输入应使用字符串而不使用原始输

    • 我已经创建了一个控制台应用程序,现在开始将其转换为摇摆应用程序。我有一个问题,我搜索了很多次,但我没有找到任何答案。 我的应用程序有一个类来验证用户的输入,如果输入错误,它会向控制台发出错误消息。所以我尝试做的是,我有一个Jtextfield并验证这个输入,如果输入错误,它应该给我错误消息。 这是我的Input类,用户可以在其中编写 这是我的输出类方法 我只是想知道我可以使用输入类的验证,还是应该