如何使用 Scanner 仅接受有效的 int 作为输入

How to use Scanner to accept only valid int as input

提问人:John 提问时间:5/26/2010 最后编辑:IvarJohn 更新时间:2/1/2020 访问量:280889

问:

我正在尝试使一个小程序更加健壮,我需要一些帮助。

Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;

System.out.print("Enter number 1: ");
num1 = kb.nextInt();

while(num2 < num1) {
    System.out.print("Enter number 2: ");
    num2 = kb.nextInt();
}
  1. 数字 2 必须大于数字 1

  2. 此外,我希望程序自动检查并忽略用户是否输入字符而不是数字。因为现在,例如,当用户输入而不是数字时,程序就会退出。r

Java 验证 java.util.scanner

评论

0赞 f1sh 5/26/2010
“kb”是什么类型?通常,从 stdin (System.in) 读取时,您会获得每个字符的 ascii/UTF8 代码,从而使您想要的检查变得非常容易。但这似乎隐藏在“kb”引用后面的对象中。在这一点上,没有人可以提供工作代码!
2赞 Andrei Fierbinteanu 5/26/2010
KB会有机会吗?new Scanner(System.in)
0赞 John 5/26/2010
static Scanner kb = new Scanner(System.in);

答:

4赞 Ledhund 5/26/2010 #1
  1. 如果 num2 必须大于 num1,则条件 num2 < num1 应为 num2 <= num1
  2. 不知道 kb 对象是什么,我会读一个,然后读 ing,如果你没有异常,那么它是一个数字,如果你这样做,读一个新的,也许通过将 num2 设置为 Integer.MIN_VALUE 并在你的示例中使用相同类型的逻辑。StringtryInteger.parseInt()catch
2赞 npinti 5/26/2010 #2

试试这个:

    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("^\\d+$");
        Scanner kb = new Scanner(System.in);
        int num1;
        int num2 = 0;
        String temp;
        Matcher numberMatcher;
        System.out.print("Enter number 1: ");
        try
        {
            num1 = kb.nextInt();
        }

        catch (java.util.InputMismatchException e)
        {
            System.out.println("Invalid Input");
            //
            return;
        }
        while(num2<num1)
        {
            System.out.print("Enter number 2: ");
            temp = kb.next();
            numberMatcher = p.matcher(temp);
            if (numberMatcher.matches())
            {
                num2 = Integer.parseInt(temp);
            }

            else
            {
                System.out.println("Invalid Number");
            }
        }
    }

您也可以尝试将字符串解析为 an,但通常人们会尽量避免抛出异常。int

我所做的是,我定义了一个正则表达式,它定义了一个数字,即一个数字。该符号表示必须有一个或多个数字。前面的额外部分是因为在 java 中,the 是一个特殊字符,所以必须转义。\d+\\d\

3赞 aioobe 5/26/2010 #3

这应该有效:

import java.util.Scanner;

public class Test {
    public static void main(String... args) throws Throwable {
        Scanner kb = new Scanner(System.in);

        int num1;
        System.out.print("Enter number 1: ");
        while (true)
            try {
                num1 = Integer.parseInt(kb.nextLine());
                break;
            } catch (NumberFormatException nfe) {
                System.out.print("Try again: ");
            }

        int num2;
        do {
            System.out.print("Enter number 2: ");
            while (true)
                try {
                    num2 = Integer.parseInt(kb.nextLine());
                    break;
                } catch (NumberFormatException nfe) {
                    System.out.print("Try again: ");
                }
        } while (num2 < num1);

    }
}
0赞 Ilya Saunkin 5/26/2010 #4

我看到 Character.isDigit 完全符合需求,因为输入将只是一个符号。 当然,我们没有关于这个 kb 对象的任何信息,但以防万一它是一个 java.util.Scanner 实例,我还建议使用 java.io.InputStreamReader 进行命令行输入。下面是一个示例:

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();
38赞 polygenelubricants 5/26/2010 #5

使用 Scanner.hasNextInt():

如果可以使用该方法将此扫描程序输入中的下一个标记解释为默认基数中的值,则返回。扫描仪不会前进到任何输入。trueintnextInt()

下面是一个片段来说明:

Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
    while (!sc.hasNextInt()) sc.next();
    num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);

您不必或担心.请注意,由于这些方法不会超过任何输入,因此如果要跳过“垃圾”,则可能需要调用,如上所示。parseIntNumberFormatExceptionhasNextXXXnext()

相关问题

评论

0赞 TeachMeJava 10/11/2018
您可以使用其他数据类型,例如双精度引用类型。对于意图:“scanner.hasNextDouble()”
0赞 LB40 5/26/2010 #6

您还可以将下一个标记作为 String,将此字符串转换为 char 数组,并测试数组中的每个字符是否为数字

我认为这是正确的,如果你不想处理例外情况。