阻止用户输入大于int max的值?

时间:2015-07-16 01:46:26

标签: java exception int max

我有一些很酷的代码,它采用int值。我让我的小弟弟测试一下,他做的第一件事是什么?他进入了这个:

12345678910

他得到了这个错误:

User did not input a number. (Error Code 1)

那不是真的。有没有办法给他一个“价值太大”的错误?这是我的代码:

try
{
    number = input.nextInt();
}
catch (InputMismatchException e)
{
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);
}

谢谢!

修改

我使用过的代码已被修改。这是我最终使用的代码,但解决方案不再出现在评论中。

        try 
        {
            double intitalinput = input.nextDouble();

            if (intitalinput > Integer.MAX_VALUE)
            {
                System.err.println("User entered a number larger than " + Integer.MAX_VALUE + ". (Error Code 2)");
                System.exit(2);
            }
            else 
            {
                number = (int) intitalinput;
            }
        }
        catch (InputMismatchException e) 
        {
            System.err.println("User did not input a number. (Error Code 1)");
            System.exit(1);
        }

感谢Jay Harris解决我的问题!

编辑第二个

我添加了一个'小于零'的支票。如果其他人偶然发现了这个想要类似帮助的问题,我会在这里显示更新的代码:

try 
{
    double intitalinput = input.nextDouble();

    if (intitalinput > Integer.MAX_VALUE)
    {
        System.err.println("User entered a number larger than " + Integer.MAX_VALUE + ". (Error Code 2)");
        System.exit(2);
    }
    else if (intitalinput < 0)
    {
        System.err.println("User entered a number smaller than 0. (Error Code 3)");
        System.exit(3);
    }
    else 
    {
        number = (int) intitalinput;
    }
}
catch (InputMismatchException e) 
{
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);
}

6 个答案:

答案 0 :(得分:5)

有很多方法可以实现这一目标,例如检查更大的数字,并使用IntegerInteger.MAX_VALUEInteger.MIN_VALUE的最大和最小尺寸进行验证。

// long userInput = input.nextLong()
// or
double userInput = input.nextDouble();

// expecting an integer but user put a value larger than integer
if (userInput > Integer.MAX_VALUE || userInput < Integer.MIN_VALUE) {
   // Throw your error
}  else {
   // continue your code the number is an int
   number = (int) userInput;
}

答案 1 :(得分:2)

尝试使用Scanner.hasNextInt()方法:

来自http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextInt()

  

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

if (input.hasNextInt()) {
    number = input.nextInt();
} else {
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);

}

如果要检测输入的数字,但可能太大而无法解析,请尝试以下方法:

   public static void main(String[] args) {

       Scanner input = new Scanner(System.in);
       System.out.println("Enter a number:");
       if (input.hasNextInt()) {
           int num = input.nextInt();
           System.out.println("num is " + num);
       } else {
           String s = input.next();
           boolean isaNumber = true;
           for (int i=0; i<s.length(); i++) {
               if (!Character.isDigit(s.charAt(i))) {
                   isaNumber = false;
                   break;
               }
           }
           if (isaNumber) {
               System.out.println("It appears you entered a number, but it canntot "
                    + "be read.  It might be too large.");
           } else {
               System.out.println("Error parsing number.");
           }
       }
   }

在这里,我只是检查输入中的每个字符是否为数字。如果是这样,我认为它是一个数字。这个代码当然可以清理,可能不是100%防弹。我只想说明你的问题的可能方法。

答案 2 :(得分:2)

您可以尝试获取long,但这只会提高限制,而不会解决问题。

另一种方法是将值作为String获取,并使用一些正则表达式检查其数值是否正在尝试转换它。如果转换失败则数字会变大。

答案 3 :(得分:0)

this answer所示,您可以将输入存储在docker hub <-> registry <-> client pull image中,然后检查数字是否过大。或者,您可以将所有值更改为long类型。

答案 4 :(得分:0)

大数字不会自动从编译器返回异常;您遇到的错误可能是因为int无法保存超过20亿的值。相反,您可以尝试将number声明为long类型。

另一个解决方案是首先使用字符串获取输入,如@karfau所述。这可以通过使用length()方法专门完成;如果字符串超过一定数量的字符,您将知道输入太长。

答案 5 :(得分:0)

你可以用try-catch块包围它。

有关详细信息,请参阅this question的第一个答案。