【问题标题】:Java: Is there an exception for when a user enters a number out of rangeJava:当用户输入超出范围的数字时是否有异常
【发布时间】:2015-01-31 23:07:56
【问题描述】:

在数组索引的上下文之外,当用户输入超出程序要求的范围的数字时,Java 中是否会引发异常?

即。程序需要一个 0-100 之间的整数,用户输入 132,可以手动抛出异常还是必须自定义?

编辑:我知道为此使用异常是没有意义的,它用于分配,我想知道我的选择。轻松的头发触发了选民。

【问题讨论】:

  • 用户永远不必处理异常,只需显示错误消息并要求另一个数字。
  • 据我所知,Java 标准中没有“NumberOutOfRangeException”。
  • 您可以在 Java API 中重用异常,只要它们有意义(例如,如果数字是索引,您可以使用 IndexOutOfBoundsException)。事实上,如果需要,您可以创建自己的自定义异常来扩展这些异常。无论如何,@Keppil 是对的;仅对程序内部的方法调用之间的通信使用异常;用户应该得到一个很好的、可读的和信息丰富的消息。
  • 实际上我的老师给我回了一封电子邮件,说除非我扔了一个,否则java不会认为这是一个例外。我不知道这是否意味着制作一个。编辑:老师说首先要抛出异常,我也不明白。
  • 这意味着Java没有内置方法说“如果用户输入不在X和Y之间”,则抛出异常。你必须接受用户输入,解析它并检查它的值;并在需要时创建并抛出异常。

标签: java exception error-handling exception-handling


【解决方案1】:

你可以抛出 IllegalArgumentException

【讨论】:

    【解决方案2】:

    Java Language Specification, regarding Integer Operations 说:

    整数运算符不以任何方式指示上溢或下溢。

    整数运算符可能会抛出异常(第 11 节),原因如下:

    • 如果需要对空引用进行拆箱转换(第 5.1.8 节),任何整数运算符都可以抛出 NullPointerException

    • 如果右侧操作数为零,则整数除法运算符 /(第 15.17.2 节)和整数余数运算符 %(第 15.17.3 节)可以抛出 ArithmeticException

      李>
    • 递增和递减运算符 ++(第 15.14.2 节、第 15.15.1 节)和 --(第 15.14.3 节、第 15.15.2 节)可以在装箱转换(第 5.1 节)时抛出 OutOfMemoryError .7) 是必需的,但没有足够的可用内存来执行转换。

    我不喜欢“异常驱动架构”,;)

    检查整数是否超过 100 并返回错误、状态码等作为用户/系统等的反馈。

    【讨论】:

      【解决方案3】:

      如果您特别想为此使用异常处理,那么您应该为它定义自己的自定义异常,而不是重用标准 Java 异常。这样你就可以确定你只是在捕捉你的特殊情况。如果确实定义了异常,则需要手动抛出并捕获它。

      请注意,我在这里专门指的是与您希望处理的用户条目相关的异常。 Java 有一组出色的异常来处理代码内部的错误(例如空指针异常)。

      话虽如此,这似乎不是一个很好的异常用例。您的代码应考虑用户在正常使用中可能输入的每个值。异常处理最好保留用于处理正常操作的异常。

      【讨论】:

      • 我完全不同意;如果期望非空值的方法获得空值,我的方法将抛出 NullPointerExceptionIllegalArgumentException 而不是 MyExceptionThatMeansExactlyTheSameThanNpeException
      • @SJuan76 我的评论是关于用户输入的值,而不是发送到方法中的值。我不会为 Java 已经有例外的东西提议客户例外。
      • @SJuan76 我添加了一个澄清以使更清晰。
      【解决方案4】:

      例外是昂贵的。应该使用一些便宜的测试函数或制作一个仅接受您想要的范围的包装类,并在所有计算中携带一个“错误”变量到最后。您最后检查该错误,并将其追溯到源头。旅行错误可以同时看到多个错误,而不仅仅是停留在发生的第一个错误。

      public class IntegerWithError
      {
          int result;
          int error;
          int errorSource; 
          // some methods to check for range, alter "error" as needed.
          // some methods to sign the start point of error
      
      }
      
      
      private static IntegerWithError Test(int parameter)  
      {
          IntegerWithError iwe=new IntegerWithError();
          if(parameter>5)
          {
              iwe.error=1;
              iwe.errorSource=iwe.hashCode();
          }
          iwe.result=parameter;
      
          return iwe;
      
      }
      
       ....
       ParameterWithError p1,p2;
       ....
       MatrixMultiplyWithError(p1,p2);
       RenderWithErrors(p1,p2,b1,b1);
       TraceError(p1); // finds if it was a function, a constructor or something.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2019-06-17
        相关资源
        最近更新 更多