介绍

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

病征

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

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

当字符串为空但不为空时相关推荐

  1. 算法-打印一个字符串的全部子序列,包括空字符串

    题目:打印一个字符串的全部子序列,包括空字符串 假如该字符串为"abc"则用画图的方式穷举所有可能 代码如下: public class PrintAllSubsquences { ...

  2. java中,字符串和集合判断是否为空

    字符串: 集合: 不为空 转载于:https://www.cnblogs.com/Dandwj/p/9431702.html

  3. 税收java_String 类中的 isEmpty() 是判断字符串是否为空的,如果为空返回 true ,不为空返回 false 。 (1.0分)_学小易找答案...

    [填空题]Claudia möchte sich mit ihrem Kollegen Tobias treffen:  Tobias, ich möchte gern mit ins Kino g ...

  4. Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:

    摘要:近期项目中,在做高级查询的时候有个条件是根据选择的字段,然后再选择字段的值为空和不为空做查询,在写SQL语句的时候费了很长时间,现在记录一下,方便日后查看: 一:查询字符串类型的字段的值不为空的 ...

  5. 查漏补缺——字符串www.qq.com所有非空子串

    子串与子序列总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. (腾讯笔试题)选择题:字符串www.qq.com所有非空子串(两个子串如果内容相同则只算一个)个数 ...

  6. Excel单元格空,设置为空字符串

    Java使用hutool工具类解析Excel,单元格空,赋值为空字符串 ExcelReader jobExcel = ExcelUtil.getReader(file.getInputStream() ...

  7. 打印一个字符串的全部子序列,包括空字符串

    package class_08;import java.util.ArrayList; import java.util.List; /*** * 打印一个字符串的全部子序列,包括空字符串**/ p ...

  8. mysql 5.1由于Host为localhost的用户为空,密码为空,导致本地用户无法登陆。

    不说了.直接上mysql的用户数据,第四列里面,host为localhost,用户为空,密码为空. 导致在本地登陆的时候除了root的账户外,其他账号不需要密码即可登陆,并且影响host为 %的用户登 ...

  9. 子串、真子串、非空子串、非空真子串的求解方法(数据结构)

    ** 字串.真子串.非空子串.非空真子串的求解方法 ** Eg:串S="software" 子串的求解方法 n(n+1)/2 +1 此处n为8,所以串S的子串为37 真子串的求解方 ...

  10. android空包签名,安卓空包签名教程

    **准备:** **windows签名工具(****点击下载签名工具:**[windows签名工具.zip]链接:https://pan.baidu.com/s/1CSelhAtmjHgzXuwXCJ ...

最新文章

  1. of介词短语作定语_如何区分介词短语作状语还是作定语
  2. 为什么我们总是「习惯性辩解」?
  3. go实现数组切片洗牌函数Shuffle
  4. CCF201604-3 路径解析(解法三)(90分)(废除!!!)
  5. 一、CXF WebService准备工作
  6. aode matlab程序,三大计算机视觉和机器学习库的算法汇总
  7. 网络蚂蚁(netants) v1.25 中文版 绿色
  8. 相亲交友婚恋活动报名小程序开发制作功能
  9. 小程序中使用全局样式
  10. 南京工程学院计算机博士,南京工程学院高层次人才引进工作实施办法(修订)...
  11. 基于银河麒麟 V10 系统安装和卸载 DM8 数据库
  12. 北京地标《信息化项目软件开发费用测算规范》完成公开征求意见
  13. 宁王比神联手,率锂电池和材料厂,决战锂矿
  14. access如何设置定期报表汇总_Access如何制作复杂报表
  15. [一起看海吧]2021.5.1秦皇岛北戴河之旅游记
  16. windows server 2008磁盘管理
  17. Android面向切面(AOP)编程实战
  18. 导数的奇偶性(含证明)
  19. [HAOI2010]软件安装 [Tarjan + 树形DP]
  20. 计算机二级c语言选择题及答案,全国计算机二级c语言练习题及答案

热门文章

  1. ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)
  2. 如何用for循环出数据库的数据
  3. JDBC的SQL注入漏洞
  4. restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素
  5. jetty java_Jetty,Java和OAuth入门
  6. junit junit_穿越JUnit流
  7. java rop_Java命令行界面(第23部分):Rop
  8. wso2 安装_WSO2注册表安装简介
  9. 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
  10. web服务优化与健壮性改进_创建健壮的微服务架构所涉及的组件