【问题标题】:Only let users input positive integers (no decimals or strings)?只让用户输入正整数(没有小数或字符串)?
【发布时间】:2013-09-19 05:40:55
【问题描述】:

我知道如何要求用户输入正整数,但我不知道如何处理代码以避免输入错误,例如小数或字符串输入。

  int seedValue;
  double angle, gunpowder;

  System.out.println("Please enter a positive integer seed value: ");
  seedValue = input.nextInt();

     while (seedValue <= 0) {  
        System.out.println("Please enter a positive integer seed value: ");
        seedValue = input.nextInt();
     }

     System.out.println("That target is " +
      threeDec.format(gen.nextDouble() * 1000) + "m away.");

【问题讨论】:

  • 附带说明,您不需要第一个输入部分 println(...seedValue = ...。循环里面的那个就够了。
  • @Tharwen:只要将seedValue 初始化为负数,或者使用do...while 循环代替。否则,要么 Java 会抱怨你使用了未初始化的值,要么循环永远不会运行。
  • Java 不将整数初始化为 0 吗?
  • @Tharwen:对于类和实例变量,是的。但是本地人,不——Java 不会初始化它们(JLS7,§4.12.3/7),并且编译器不会让你阅读它们,直到它看到你确实为它们分配了一个值(§16)。

标签: java string input integer


【解决方案1】:

这可能是一个方法:

  • 使用Scanner.readLine(); 将输入读取为string
  • 尝试使用Integer.parseInt 方法将字符串转换为int。如果输入字符串包含小数和无效数字,此方法将抛出 NumberFormatException
  • 如果输入值在上一步中被正确解析,则检查是否为负

【讨论】:

    【解决方案2】:
    System.out.println("Please enter a positive integer seed value: ");
    boolean flag = true;
    while(flag) {
      try {
        seedValue = Integer.valueOf(input.nextLine());
        if (seedValue <= 0) {
          System.out.println("input is not a positive Integer ");
          System.out.println("Please enter a positive integer seed value: ");
        } else {
          flag=false;
        }
      } catch(NumberFormatException e) {
          System.out.println("input is not a positive Integer ");
          System.out.println("Please enter a positive integer seed value: ");
      }
    
    }
    

    【讨论】:

    • 有更好的方法来实现这一点。
    • 我不认为有什么你可以真正改变的东西会在这一点上增加这个线程的价值。
    • @redFIVE :你可能是对的......但它让我们没有理由停止改进一个糟糕的答案,它是否匹配。? ;)
    • 如果我要做这样的事情,我会(a)摆脱标志,将while(flag)更改为while (true),将flag=false;更改为break;,(b) seedValue &lt;= 0 时抛出异常,因此异常处理程序是唯一抱怨无效输入的东西,并且 (c) 将提示移动到输入之前,因此不必在任何地方重复。但我可能不会这样做;确实有更清洁的方法。
    • 实际上,do...while 将完全消除对 break 的需求。伪代码:do { show prompt; get input; try { convert; } catch { input = -1; } if input &lt;= 0 then print error message; } while input &lt;= 0;
    【解决方案3】:

    我假设“输入”是 Scanner 类。如果是这样,请查看 Scanner.nextInt() 方法的 javadoc。如果未输入整数,则会引发许多异常。所以你应该把你的调用放在一个 try catch 块中并寻找这些异常。由于仍然允许他们输入负值,因此您可以做的下一件事是简单地检查输入是否小于 0,如果是,则输出一些消息,让用户知道他们只能输入正值。

    【讨论】:

      【解决方案4】:

      您的尝试看起来不错,您让用户输入一些内容,然后检查它是否与所需的表单匹配。如果没有,请继续再次询问用户或输出错误或其他任何内容。如果您想以某种方式制作程序,诸如“-”字符之类的字母在输入时甚至不会出现在屏幕上,您仍然必须阅读用户输入的任何内容,对其进行验证,修改字符串(删除非法字母)并在每次击键时刷新屏幕。这可能不是这里应该做的。

      想象一下您的常用社交网站,同时创建具有密码要求的个人资料,例如有一个数字、至少 6 个字母等。您可以在文本框中输入您想要的任何内容,只有在提交表单后,程序才会接受您的输入或将您重定向到相同的表单并显示错误消息以提示问题。

      【讨论】:

        【解决方案5】:

        我不确定input 到底是什么类,但我认为它的Scanner 是从标准输入读取的。如果是这种情况,您可以利用nextInt() 抛出的异常,特别是InputMismatchException。您的代码将是 -

        int seedValue;
        double angle, gunpowder;
        
        System.out.println("Please enter a positive integer seed value: ");
        while(invalidInput){
           try{
             seedValue = input.nextInt();
             if(seedValue <= 0) {  
                    System.out.println("Please enter a positive integer seed value: ");
             }
             else{invalidInput=false;}
           }
           catch(InputMismatchException e){
                System.out.println("Please enter a positive integer seed value: ");
           }
        

        }

             System.out.println("That target is " +
              threeDec.format(gen.nextDouble() * 1000) + "m away.");
        

        【讨论】:

        • 如果用户输入字母,您的代码将进入无限循环
        • 不,它没有。如果您输入字母输入,则会触发 catch 块。这会导致另一个提示和(正确)重新启动循环
        • 这不是因为退出条件,而是因为扫描仪...当 nextInt() 抛出异常时,扫描仪不会移动,它只是继续从相同的位置形成无限循环抛出 InputMismatchException。更好的解决方案是使用 Integer.valueOf(input.nextLine()) 并在 catch 子句中使用 NumberFormatException
        • 不,它确实进入了无限循环......检查我上面的评论
        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        相关资源
        最近更新 更多