1

我有add(String)调用私有方法的公共方法inspectSequence(String)来检查字符串是否有效。

如果传递String有效,则此方法返回数组,如果无效则方法抛出IllegalArgumentException

代码是下一个

public void add(String sequence) throws IllegalArgumentException{
  inspectSequence(sequence);
}

private int[] inspectSequence(String sequence){
  int[] array;
  //some actions
  if(<some condition>) throw new IllegalArgumentException("description");
  return array;
}

因此,在某些情况下,将无效String传递给add方法输出将是下一个:

java.lang.IllegalArgumentException: description
at inspectSequence
at add

但我不想让用户知道私有inspectSequence方法,因为这是实现细节,对吧?

那么在这种情况下我能做些什么呢?在这里抛出未经检查的异常是个好主意吗?

在方法内抛出异常是一个好主意,inspectSequence或者我应该null在提供String无效时返回,然后检查add方法中的返回结果,并根据它抛出或不抛出异常?

4

2 回答 2

6

但是我不想让用户知道私有的 inspectSequence 方法,因为这是实现细节,对吧?

我会说不。确实,您不希望用户(在这种情况下意味着有人调用代码)“知道”内部方法,例如inspectSequence(). “知道”我的意思是能够打电话,依赖等。

知道异常可能会被抛出以及在什么情况下调用者应该知道的事情,知道它被抛出的确切位置不是必需的,但不会造成伤害。

当然,您可以在调用方法中捕获该异常并抛出另一个异常,但这只会丢失信息并且可能使代码更难调试/维护,因为不接受输入的信息丢失给调用者。

那么在这种情况下我能做些什么呢?在这里抛出未经检查的异常是个好主意吗?

这取决于该异常是应该在运行时处理还是修复。

假设调用者需要知道序列是无效的并且应该适当地处理该信息,例如向最终用户显示一些信息。在这种情况下,最好抛出一个描述该情况的检查异常。

另一方面,如果输入违反了方法的约定,即输入序列永远不应该是无效的(否则它是一个编程错误),那么IllegalArgumentException就可以了——比如将 null 传递给一个不期望 null 的方法参数。

在 inspectSequence 方法中抛出异常是一个好主意,或者当提供的 String 无效时我应该返回 null 然后在 add 方法中检查返回的结果,并根据它抛出或不抛出异常?

我会说不。在某些情况下,返回 null 然后在调用方法中处理它可能是一种合理的方式(例如,如果您有不同的调用者以不同的方式处理 null),但您的情况并非如此。它会使代码更复杂,因此更难阅读和维护,特别是因为 null 可能有多种含义,您必须在这种情况下定义这些含义。

于 2016-02-22T14:59:42.877 回答
0

您可以捕获 IllegalArgumentException 并抛出您自己的异常。

public void add(String sequence) throws MyCustomException {
    try {
        inspectSequence(sequence);
    } catch (IllegalArgumentException e) {
        throw new MyCustomException("more readable cause that hides internals");
    }
}
于 2016-02-22T15:03:39.047 回答