etx*_*lpo 4 java exception-handling
请参阅以下两个示例.假设两个类都包含属于广泛使用的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...
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的错误消息是描述性的(并且它是),则没有人会费心去查看堆栈跟踪.因此,第一种形式更好,因为它封装了验证逻辑.
请注意,各种库中有大量的断言方法可供使用,请参阅:Objects.requireNonNull和Validate.notNull).