推迟检查 IllegalArgumentException 的建议是什么?

What is advisable to defer the checking an IllegalArgumentException?

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

现在,A到F都是有效的,但是G-Z对于16位是无效的。我在下面有两种情况可以抛出 IllegalArguments,在情况 1 中它是在开始时抛出的,甚至在 additon 可以开始之前。在第二个示例中,它发生在添加正在进行时。

请不要建议更改代码片段,它是为问我的问题量身定做的。问题是 - 在算法 m(在本例中为加法)期间抛出 IllegalArgument 比预先抛出 IllegalArgument 是更好的做法/常见做法吗?

案例一:

  1. 如果 char1.length == 0,或 char2.length == 0 抛出非法参数。
  2. 检查 char1 中的每个字符,如果任何字符非法则抛出 illegalargs。
  3. 检查 char2 中的每个字符,如果任何字符非法则抛出 illegalargs。

Cons of case 2: Extra for loop to check each char in char arrays. O(n)

案例二:

  1. 如果 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.

此处在实际添加过程中抛出非法参数。

在这种情况下,由于稍后检查而不会对行为造成真正的伤害 - 到目前为止在方法中执行的代码不会产生明显的影响。您会浪费少量时间,但在您抛出异常的情况下,这实际上可以忽略不计。

肯定想要避免(只要有可能,无论如何)仅在操作进行到一半时才检测到无效输入并且您到目前为止所做的工作已经完成的情况可见的。这使得从错误中恢复变得更加困难。

就个人而言,我更喜欢在方法开始时进行尽可能多的验证 - 这样从代码本身就可以清楚地知道期望是什么,并且代码的 "work" 可以全部放在一起,假设输入有效(因为它在验证后发生)。

然而,有时候,只有当您已经完成 一些工作时,您才会知道某件事是否有效 - 发生这种情况时很烦人,但有时是不可避免的。如果可能的话,尽早完成 "local"(无副作用)。