Java方法包含另一个抛出异常的方法

时间:2016-02-22 14:55:57

标签: java unchecked-exception

我有公共方法add(String),它调用私有方法inspectSequence(String)来检查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,然后在{{1}}方法中检查返回的结果并取决于它抛出或不抛出异常?

2 个答案:

答案 0 :(得分:6)

  

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

我会说不。确实,您不希望用户(在该上下文中意味着有人调用代码)“了解”内部方法,如inspectSequence()。 “知道”我的意思是能够打电话,依赖等等。

知道可能会抛出异常,并且在什么情况下调用者应该知道什么,知道究竟它被抛出的地方是没有必要的但是不会伤了。

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

  

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

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

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

另一方面,如果输入违反了方法的约定,即输入序列从不无效(或者是编程错误)那么IllegalArgumentException将是ok - 将null传递给不期望null参数的方法的情况。

  

最好在inspectSequence方法中抛出异常,否则我应该在提供的String无效时返回null,然后在add方法中检查返回的结果,并根据它抛出或不抛出异常?

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

答案 1 :(得分:0)

您可以捕获IllegalArgumentException并自行抛出。

public void add(String sequence) throws MyCustomException {
    try {
        inspectSequence(sequence);
    } catch (IllegalArgumentException e) {
        throw new MyCustomException("more readable cause that hides internals");
    }
}