有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

现在,A到F是有效的,但是G-Z对于16位是无效的。下面我有两个案例来抛出非法辩论,在案例1中,它是在开始时抛出的,甚至在additon开始之前。在第二个例子中,它发生在additon正在进行时

请不要建议对代码片段进行更改,这是专门为问我的问题而设计的。问题是——在算法m(在本例中是加法)期间抛出非法辩论,而不是在前面抛出,这是更好的做法/常规做法吗

案例1:

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

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

案例2:

  1. 如果char1。长度==0,或字符2。长度==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.

在这里,当实际的加法进行时抛出非法参数


共 (1) 个答案

  1. # 1 楼答案

    在这种情况下,由于以后的检查,不会对行为造成真正的伤害——这不像迄今为止在该方法中执行的代码会产生明显的影响。你会浪费一点时间,但实际上,在你抛出异常的情况下,这是可以忽略的

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

    就我个人而言,我更喜欢在方法开始时进行尽可能多的验证——这样,代码本身就可以清楚地知道期望值是什么,并且代码的“工作”都可以放在一起,假设输入是有效的(就像验证后发生的那样)

    然而,有时候,只有当你已经做了一些工作时,你才会知道某件事是否有效——这种情况很烦人,但有时是不可避免的。如果可能的话,试着让早期的工作“局部”(没有副作用)