为什么hasNextInt()方法不适用于大整数?

时间:2018-03-18 15:04:28

标签: java java.util.scanner

我正在编写一个简单的程序,它接收来自Scanner对象的整数输入,确定它是否是回文,并返回布尔值。

对于大多数数字,它运作良好。但是,在此代码段中:

private static void programRunner() {
    System.out.print("Insert your number:");
    Scanner in = new Scanner(System.in);
    if (in.hasNextInt()) {
        int testNumber = in.nextInt();
        boolean result = palindromeTester(testNumber);
        System.out.println(result);
        programRunner();
    } else {
        System.exit(0);
    }
}

我添加了“System.exit(0)”表达式,以便用户通过有意键入任何非整数值来轻松终止程序。问题是当提供“相当大”的整数时,例如“1234567654321”,代码会启动System.exit(0),这意味着它不被识别为整数?

我认为问题在于hasNextInt方法的“默认半径”,这可能会限制它识别的整数值的大小。 (该程序可以运行9位整数)但我不确定。或者递归有什么问题吗?

3 个答案:

答案 0 :(得分:3)

因为Java中的int 32位,并且只能将2^31 - 1(2147483647)作为最大值(另请参阅Integer.MAX_VALUE)。

除此之外的任何内容都不是int,而是long(除非它比Long.MAX_VALUE更大,在这种情况下,您需要将值设为BigInteger。 )

Integer.MAX_VALUELong.MAX_VALUEScanner.nextInteger()Scanner.nextLong()Scanner.nextBigInteger()BigInteger

答案 1 :(得分:0)

如果您有大约" nextLong()"您可以使用long整数阅读如下:

private static void programRunner() {

        System.out.print("Insert your number:");
        Scanner in = new Scanner(System.in);
        if (in.hasNextLong())
        {
            long testNumber = in.nextLong();
            boolean result = palindromeTester(testNumber);
            System.out.println(result);
            programRunner();
        }
        else
        {
            System.exit(0);
        }
        }

答案 2 :(得分:0)

您似乎已超出int类型的范围限制。 long类似乎是您正在寻找的类型。

因此,您可以使用hasNextLong()类的nextLong()Scanner方法,也可以使用@Hovercraft Full Of Eels在评论中建议,因为您不使用数据采用数值方式,最好以String的形式接收数据。

最后,但并非最不重要的是,我发现在这里使用递归效率很低,因为每次递归调用都会创建一个新的堆栈帧,以及每次递归调用时,您正在新建Scanner实例。最好使用while循环。