我有公共方法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}}方法中检查返回的结果并取决于它抛出或不抛出异常?
答案 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");
}
}