什么是推迟检查IllegalArgumentException?

时间:2015-02-13 16:08:46

标签: java illegalargumentexception

考虑一个例子,添加两个以char数组表示的十六进制数: 例如:2A和1D。

现在,A到F有效,但G-Z对16位无效。下面有两个案例可以抛出IllegalArguments,如果是1,它会在开始时被抛出,甚至可以开始添加。在第二个例子中,它在additon正在进行时发生。

请不要建议更改代码段,它可以根据我的问题量身定做。问题是 - 在算法期间抛出IllegalArgument(在这种情况下是加法)而不是在前期,更好的做法/惯例是什么?

案例1:

  1. 如果char1.length == 0,或char2.length == 0则抛出非法规定。
  2. 检查char1中的每个char,如果有任何char是非法的,则抛出illegalargs。
  3. 检查char2中的每个char,如果有任何char是非法的,则抛出illegalargs。
  4. Cons of case 2: Extra for loop to check each char in char arrays. O(n)

    案例2:

    1. 如果char1.length == 0,或char2.length == 0则抛出违规行为。

    2.  for (; j >= 0; j--, i--) {
                  int num1Digit = Character.digit(longNum.charAt(i), radix);
                  if (num1Digit == -1) throw new IllegalArgumentException("Invalid radix for character"); // eg: 1Z, and radix is 16.
                  int num2Digit = Character.digit(shortNum.charAt(j), radix);
                  if (num2Digit == -1) throw new IllegalArgumentException("Invalid radix for character"); // eg: 1Z, and radix is 16.
      

      当实际添加正在进行时,抛出非法参数。

1 个答案:

答案 0 :(得分:3)

在这种情况下,由于稍后检查而导致的行为没有真正的危害 - 这与在方法中到目前为止执行的代码不会产生可观察到的影响。你会浪费一点时间,但在你抛出异常的情况下,这实际上是微不足道的。

这使得从错误中恢复更加困难。

就个人而言,我更喜欢在方法开始时尽可能多地进行验证 - 从代码本身可以清楚地看出期望是什么,代码的“工作”都可以放在一起,假设有效输入(在验证后发生)。

然而,有时候,当你已经完成某些工作时,你只会知道某些东西是否有效 - 当这种情况发生时会很烦人,但有时候这是不可避免的。如果可能的话,尽量让早期作品“本地化”(没有副作用)。