【问题标题】:Best way to check arguments before running method在运行方法之前检查参数的最佳方法
【发布时间】:2014-05-22 14:54:05
【问题描述】:

所以, 例如,如果我有一个名为“除法”的方法,它只会除以整数并返回一个整数,那么检查除数是否为 != 0

的最佳方法是什么

方式一:

    private int divide(int i1, int i2) {
         if(i2 == 0) return 0;

         return i1/i2;
}

方式二:

    private int divide(int i1, int i2) {
        if(i2 != 0) {
            return i1/i2;       
        } else {
            return 0;
        }
    }

你更喜欢哪一个?

编辑:我知道,您通常不会编写这样的函数,因为如果除数为 0,它将引发异常。这只是为了澄清我的问题。

编辑2:如果除数为0,我只是将方法函数更改为返回0。

【问题讨论】:

  • 我总是更喜欢解析节点较少的那个。在returnthrow 之后的else 总是多余的。

标签: java arguments conditional-statements


【解决方案1】:

如果您的目标是在第二个参数为0 时抛出RuntimeException,则您无需执行任何操作。

private int divide(int i1, int i2) {
    return i1/i2; // This will throw an ArithmeticException
}

上面的代码将抛出一个从RuntimeException 扩展而来的ArithmeticException,从而减少了显式抛出RuntimeException 的工作。

编辑:由于您问题中的代码 sn-p 只是一个示例,因此这是更新后的答案。

避免不必要的else 更简洁更好,例如在这种情况下,因为else 是另一个分支块,如果你真的不打算在那里做很多事情,而不仅仅是return , 代码最好没有它。

如果它进入if,它会返回,从而使else 无用,如果没有,那么只需return 就足够了,因为您需要做的就是从return 返回方法。

private int divide(int i1, int i2) {
    if(i2 == 0) {
        return 0;
    }
    return i1/i2;
}

【讨论】:

  • 这只是一个例子,以澄清我的问题。
  • @TimoV - 老实说,你不应该使用这样的例子。我建议您更改您的问题以抛出已检查的异常而不是未检查的异常,因为您当前问题的最佳解决方案是我在上面发布的内容。
  • @TimoV - 我在您编辑问题后更新了答案。
【解决方案2】:

使用第一种方法更常见并且(我相信更广泛接受),如果您检查的变量不止一个或两个,就会开始出现很长的行缩进。第一种方法也比第二种方法更简洁。

【讨论】:

    【解决方案3】:

    我更喜欢第二个,因为它易于阅读,并且如果您的需求在未来发生变化,例如 if i2==o 那么你可以轻松维护它。

    【讨论】:

      【解决方案4】:

      我更喜欢第二种方式,因为它像 Sanjay Rajjadi 所说的那样更具可读性,

      private int divide(int i1, int i2) {
          if(i2 != 0) {
              return i1/i2;
          } else {
              throw new RuntimeException();
          }
      }
      

      但是为什么要抛出异常呢?您可以向用户显示警报或消息,要求他插入新的 int。

      【讨论】:

        【解决方案5】:

        就个人而言,我不喜欢它们,因为抛出RuntimeException 不是一个好习惯;您应该创建自己的异常子类。除此之外,我不明白为什么有必要显式抛出此异常,因为生成的异常 (java.lang.ArithmeticException) 是 RuntimeException 的子类。
        也许你应该尝试这样的事情?

        private int divide(int i1, int i2) throws DivisionByZeroException {
            try {
                return i1/i2;
            } catch(ArithmeticException e) {
                throw new DivisionByZeroException(e);
            }
        

        【讨论】:

          【解决方案6】:
          private int divide(int i1, int i2) throws IllegalArgumentException{
              if(i2==0)
              throw new IllegalArgumentException("Argument 'divisor' is 0");
              else return i1/i2;
          }
          

          【讨论】:

            【解决方案7】:

            无。

            您不必显式地 throw 那个异常,如果除数为零,java.lang.ArithmeticException 将被抛出。

            【讨论】:

              【解决方案8】:

              如果我真的需要,我会使用第一种方法,因为如果检查很多争论,会出现大量缩进。

              但我不得不说:如果需要这样的检查,请务必评估两次。

              在您的特定情况下,检查是多余的,因为除以 0 将抛出 ArithmeticException,即:/ by zero

              请参阅this question 了解为什么人们经常夸大检查,尤其是 null/not null 检查。

              【讨论】:

                【解决方案9】:

                使用下面的方法。您无需检查零。只需抛出算术异常。

                private int divide( int i1, int i2 ) throws ArithmeticException
                {
                    return i1/i2;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-11-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-18
                  • 2011-04-30
                  • 2015-05-24
                  • 2015-04-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多