我已经大量使用了这些片段,寻找null
值和空字符串。
我在我的方法中使用“参数测试”-模板作为检查接收到的参数的第一个代码。
testNullArgument
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
您可能需要更改例外消息以适合您公司或项目的标准。但是,我建议您添加一些消息,其中应包含有问题的参数的名称。否则,方法的调用者将不得不查看代码以了解出了什么问题。(NullPointerException
没有消息的A 会产生相当荒谬的消息“ null”的异常)。
testNullOrEmptyStringArgument
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
throw new IllegalArgumentException(
"Illegal argument. The argument cannot be an empty string: ${varName}");
}
您还可以从上方重用null检查模板,并实现此代码段以仅检查空字符串。然后,您将使用这两个模板来生成上面的代码。
但是,上面的模板存在一个问题,如果in参数是最终参数,则必须修改产生的代码。 ${varName} = ${varName}.trim()
否则将失败)。
如果您使用大量的最终参数,并且想检查空字符串,但不必在代码中修剪它们,则可以改用以下方法:
if (${varName} == null) {
throw new NullPointerException(
"Illegal argument. The argument cannot be null: ${varName}");
}
if (${varName}.trim().isEmpty()) {
throw new IllegalArgumentException(
"Illegal argument. The argument cannot be an empty string: ${varName}");
}
testNullFieldState
我还创建了一些片段来检查未作为参数发送的变量(最大的区别是异常类型,现在是一种例外IllegalStateException
)。
if (${varName} == null) {
throw new IllegalStateException(
"Illegal state. The variable or class field cannot be null: ${varName}");
}
testNullOrEmptyStringFieldState
if (${varName} == null) {
throw new IllegalStateException(
"Illegal state. The variable or class field cannot be null: ${varName}");
}
${varName} = ${varName}.trim();
if (${varName}.isEmpty()) {
throw new IllegalStateException(
"Illegal state. The variable or class field " +
"cannot be an empty string: ${varName}");
}
testArgument
这是用于测试变量的通用模板。我花了几年时间才真正学会欣赏它,现在我已经使用了很多(当然与上面的模板结合使用了!)
if (!(${varName} ${testExpression})) {
throw new IllegalArgumentException(
"Illegal argument. The argument ${varName} (" + ${varName} + ") " +
"did not pass the test: ${varName} ${testExpression}");
}
您输入变量名或返回值的条件,后跟一个操作数(“ ==”,“ <”,“>”等)和另一个值或变量,如果测试失败,则结果代码将引发IllegalArgumentException。
使用稍微复杂的if子句的原因是,整个表达式都包裹在“!()”中,这是为了可以在异常消息中重用测试条件。
也许这会使同事感到困惑,但前提是他们必须看一下代码,而如果您抛出此类异常,他们可能就不必这么做了。
这是数组的示例:
public void copy(String[] from, String[] to) {
if (!(from.length == to.length)) {
throw new IllegalArgumentException(
"Illegal argument. The argument from.length (" +
from.length + ") " +
"did not pass the test: from.length == to.length");
}
}
通过调用模板,输入“ from.length” [TAB]“ == to.length”,可以得到此结果。
结果是比“ ArrayIndexOutOfBoundsException”或类似方法更有趣的方法,实际上可能使您的用户有机会找出问题所在。
请享用!