请参阅下面的两个示例。假设这两个类都包含属于广泛使用的 API 库的公共方法。
AClass.java
更容易编写(可能由于噪音较小而更容易阅读),但是当检测到错误时,堆栈跟踪中的第一个方法是内部方法(nullCheck(...)
)并且异常消息不是指该方法。这会给用户带来不必要的困惑吗?我的意思是在用户思考的意义上:“这是一个引发异常的内部方法,一定是库中的错误,而不是我的程序中的错误。什么* * 无用的库......”
BClass.java
写起来比较麻烦(连同它的所有 if 语句),但是当检测到错误时,堆栈跟踪的第一行会指出第一次检测到错误的 API 方法(由用户调用)。这是否更有可能让用户认为:“我正在从我的代码中调用该方法,一定是我传入的参数有问题”。
在公共 API 中检查参数的有效性时,哪种是引发异常的首选方式?或者这两个例子被认为是相等的?
public class AClass {
public void publicApiMethod1(String a){
nullCheck(a, "a");
// do something...
}
public void publicApiMethod2(String a, String b, String c){
nullCheck(a, "a");
nullCheck(b, "b");
nullCheck(c, "c");
// do something...
}
private void nullCheck(Object a, String argName) {
if(a == null){
throw new NullPointerException("Null argument: " + argName);
}
}
}
public class BClass {
public void publicApiMethod1(String a){
if(a == null){
throw new NullPointerException("Null argument: 'a'");
}
// do something...
}
public void publicApiMethod2(String a, String b, String c){
if(a == null){
throw new NullPointerException("Null argument: 'a'");
}
if(b == null){
throw new NullPointerException("Null argument: 'b'");
}
if(c == null){
throw new NullPointerException("Null argument: 'c'");
}
// do something...
}
}