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

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



数字2必须大于数字1
我还希望程序自动检查并忽略用户是否输入字符而不是数字。因为现在当用户输入例如r而不是数字时,程序将退出。


评论

“ kb”是什么类型?通常,从stdin(System.in)读取时,您会为每个字符获得ascii / UTF8代码,这使您想要的检查非常容易。但这似乎隐藏在“ kb”引用后面的对象中。目前尚无人提供有效的代码!

kb是否会成为新的Scanner(System.in)?

静态扫描仪kb =新扫描仪(System.in);

#1 楼

使用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(),如上所示。

相关问题


输入错误的类型时,如何防止扫描仪抛出异常? (java)


评论


您可以使用其他数据类型,例如Double引用类型。例如:“ scanner.hasNextDouble()”

– TeachMeJava
18-10-10在19:22



#2 楼


如果num2必须大于num1,则num2 不知道kb对象是什么,我会先读取String,然后读取tryInteger.parseInt(),如果不知道't catch是一个例外,那么它是一个数字,如果您这样做,请读一个新的数字,方法可能是将num2设置为Integer.MIN_VALUE并在示例中使用相同类型的逻辑。


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

    }
}


#4 楼

尝试以下操作:

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


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

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

#5 楼

我看到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();


#6 楼

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

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