27

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

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而不是数字时,程序就会退出。

4

6 回答 6

36

使用Scanner.hasNextInt()

返回true此扫描器输入中的下一个标记是否可以int使用该方法解释为默认基数中的值nextInt()。扫描仪不会超过任何输入。

这是一个片段来说明:

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);

您不必parseInt担心或担心NumberFormatException。请注意,由于这些hasNextXXX方法不会超过任何输入,因此next()如果您想跳过“垃圾”,您可能必须调用,如上所示。

相关问题

于 2010-05-26T12:44:25.427 回答
4
  1. 如果 num2 必须大于 num1,则条件 num2 < num1 应该是 num2 <= num1
  2. 不知道 kb 对象是什么,我会读 aString然后tryingInteger.parseInt()如果你没有catch异常,那么它是一个数字,如果你这样做,读一个新的,也许通过将 num2 设置为 Integer.MIN_VALUE 并使用相同您的示例中的逻辑类型。
于 2010-05-26T12:26:10.293 回答
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);

    }
}
于 2010-05-26T12:34:51.133 回答
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,但通常人们会尽量避免抛出异常。

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

于 2010-05-26T12:33:15.050 回答
0

我看到 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();
于 2010-05-26T12:42:46.813 回答
0

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

如果您不想处理异常,我认为这是正确的。

于 2010-05-26T12:50:23.837 回答