考虑一个例子,添加两个以char数组表示的十六进制数: 例如:2A和1D。
现在,A到F有效,但G-Z对16位无效。下面有两个案例可以抛出IllegalArguments,如果是1,它会在开始时被抛出,甚至可以开始添加。在第二个例子中,它在additon正在进行时发生。
请不要建议更改代码段,它可以根据我的问题量身定做。问题是 - 在算法期间抛出IllegalArgument(在这种情况下是加法)而不是在前期,更好的做法/惯例是什么?
案例1:
Cons of case 2: Extra for loop to check each char in char arrays. O(n)
案例2:
如果char1.length == 0,或char2.length == 0则抛出违规行为。
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.
当实际添加正在进行时,抛出非法参数。
答案 0 :(得分:3)
在这种情况下,由于稍后检查而导致的行为没有真正的危害 - 这与在方法中到目前为止执行的代码不会产生可观察到的影响。你会浪费一点时间,但在你抛出异常的情况下,这实际上是微不足道的。
这使得从错误中恢复更加困难。
就个人而言,我更喜欢在方法开始时尽可能多地进行验证 - 从代码本身可以清楚地看出期望是什么,代码的“工作”都可以放在一起,假设有效输入(在验证后发生)。
然而,有时候,当你已经完成某些工作时,你只会知道某些东西是否有效 - 当这种情况发生时会很烦人,但有时候这是不可避免的。如果可能的话,尽量让早期作品“本地化”(没有副作用)。