当字符串为空但不为空时

介绍

我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及将来如何防止它。 我还将探讨该问题的不同解决方案。

病征

有问题的代码看起来做得不错。:

if(trouble != null && !trouble.isEmpty()) {
System.out.println(“fine here: ” + trouble);
} else {
System.out.println(“not so fine here: ” + trouble);
}

该代码将命中“ fine here”块,但将输出“ null”值。 通过读取文件来设置变量。

调查中

我和开发人员查看了打印件并进行了几次测试,但结果却相同。 我看了在哪里设置变量。 如果那里什么也没有,它应该将值设置为null,但是打印输出表明该值为null。 我有一个主意,我们决定进行测试。 他更改了代码:

if(trouble != null && !trouble.isEmpty() && !trouble.equals(“null”)) {
System.out.println(“fine here”);
} else {
System.out.println(“not so fine here”);
}

每次测试都进行到“这里不太好”。 似乎该值被设置为字符串“ null”而不是值null。

学什么

说实话,我以前已经看过了。 我花了大约一天的时间开始执行相同的代码来弄清楚它。 我从中了解到,参数检查仍然是一件好事。 我发现有效的字符串检查可以在代码中的多个地方使用。 为了防止复制和粘贴反模式,我将验证抽象为一个方法。

private static boolean isValidString(String test) {
boolean isValid = (test != null && !test.isEmpty() && !test.equals(“null”));
return isValid;
}

防止越来越长的验证行的下一步是将其抽象到验证对象。 这允许一个肮脏的单词列表。

public class StringValidator {
private List<String> dirtyWords;

public static final int ARRAY_SIZE = 20;
public StringValidator() {
dirtyWords = new ArrayList(ARRAY_SIZE);
}

public boolean isValid(String test) {
boolean isValid = false;
isValid = (test != null) && !test.isEmpty();
if(isValid) {
for(String word: dirtyWords) {
if(word.equals(test)) {
isValid = false;
break;
}
}
}
return isValid;
}

public void addDirtyWord(String word) {
if(!isValidString(word)){
throw new IllegalArgumentException(word + ” is not a good dirty word”);
}

dirtyWords.add(word);
}

private boolean isValidString(String test) {
return ((test != null) && !test.isEmpty());
}
}

which leads to this parameter checking code:

if(validator.isValid(trouble)) {
System.out.println(“fine here”);
} else {
System.out.println(“not so fine here”);
}

结论

有时我们需要跳出框框思考一下问题。 让您对问题有第二眼的感觉并不难; 这也许是发生的最好的事情。 我探索了最终创建验证器的解决方案,该验证器无需经过冗长而令人困惑的测试即可包含脏词列表。

翻译自: https://www.javacodegeeks.com/2014/10/when-a-string-is-null-but-not-null.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值