当字符串为空但不为空时

介绍

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

病征

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(六): 一些常用的数据库 注解...

一、 实体 Bean 每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 Entity 注解来进行声明。 声明实体Bean Entitypublic class Flight implements Serializable { Long id; Id public Long getId() { return id; } public void setId(Long id) { this.id id; }} E…

SWT鼠标单击实现

最近&#xff0c;我做了一些SWT定制小部件的开发&#xff0c;偶然发现了一个问题&#xff0c; 为什么没有默认的SWT鼠标单击侦听器&#xff1f; 由于这个主题有时会提出&#xff0c;所以我认为写一两句话来说明背后的理性基础以及如何实现鼠标单击通常不会受到伤害。 SWT鼠标请…

第三周进度总结

本周大部分时间花费在了考驾照上&#xff0c;所以没有在学习上用太多的时间。在不多的时间里看完了老师推荐的《大道至简》这本书&#xff0c;从书中学到了很多编程方面的思想&#xff0c;受益匪浅。还完成了2个代码的编译&#xff0c;一个是判断AB和C的关系&#xff0c;这个并…

页面中插入视频的方法---video/embed/iframe总结

1. video标签 当前主流的方法当然是HTML5中的video标签了&#xff0c;但是 当前&#xff0c;video 元素只支持三种视频格式&#xff1a; Ogg 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件 MPEG4 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件 WebM 带有 VP…

Spring请求级备忘录

介绍 记忆化是一种方法级别的缓存技术&#xff0c;用于加快连续调用的速度。 这篇文章将演示如何仅使用Spring AOP实现任何数据源的请求级可重复读取。 Spring缓存 Spring提供了非常有用的缓存抽象 &#xff0c;允许您将应用程序逻辑与缓存实现细节分离。 Spring Caching使用…

从一个帖子看 所谓“知乎” 的真实水平

帖子地址&#xff1a;https://www.zhihu.com/question/27535713 明末尤其是崇祯后期&#xff0c;最大的背景是天灾瘟疫反复肆虐&#xff0c;三成人死于饥荒&#xff0c;三成人死于瘟疫&#xff0c;四成为生存从贼是当时中原的真实写照。 抛开这个最大前提不谈&#xff0c;去乱弹…

新的开始,新的挑战

我承认&#xff0c;我还比较年轻&#xff0c;我承认&#xff0c;我的经验很少&#xff0c;我承认&#xff0c;我的能力还是比较小。。。。。。 但是&#xff0c;我不怕&#xff0c;我敢往前走&#xff0c;错了我就改&#xff0c;不行我就努力&#xff0c; 要么痛苦的坚持到游戏…

响应式布局笔记

一. 布局设计 固定布局&#xff1a;以像素作为页面的基本单位&#xff0c;不管设备屏幕及浏览器宽度&#xff0c;只设计一套尺寸&#xff1b; 可切换的固定布局&#xff1a;同样以像素作为页面单位&#xff0c;参考主流设备尺寸&#xff0c;设计几套不同宽度的布局。通过设别的…

麦冬

麦冬 中文学名&#xff1a;麦冬 拉丁学名&#xff1a;Ophiopogon japonicus (Linn. f.) Ker-Gawl. 别称&#xff1a;麦门冬、沿阶草 植物界百合科 主要价值&#xff1a; 1、有养阴润肺、益胃生津、清心除烦的功效&#xff0c;用于肺燥干咳、阴虚痨嗽、喉痹咽痛、津伤口渴、…

如何使用Callable和FutureTask

介绍 从Java 1.5开始&#xff0c;在java.util.concurrent下有了新的对象集。 该程序包具有许多不同的类&#xff0c;包括线程队列。 当我用Java 1.2编程时&#xff0c;我本可以使用那些&#xff01; 当我开始看这些新玩具时&#xff0c;我变得犹豫不决。 这是什么可调用的东西&…

NodeJS的安装与使用

Node.js 就是运行在服务端的 JavaScript。越来越多的人在使用它&#xff0c;通过他我们可以用JavaScript来构建后台。对于前端程序员而言&#xff0c;不言而喻这是一条多么令人振奋的消息。对于后台程序员而言&#xff0c;这也是一种很不错的选择。 下面我就来讲解下nodejs的安…

转载 300年前的黑色“巫女”

1741年&#xff0c;北极。 白令招呼水手们把船靠上小岛的时候&#xff0c;一排黑色的鸬鹚站在陡峭的悬崖上&#xff0c;像一群黑色的巫女&#xff0c;一动不动朝着他们张望。白令顿时有了一种不祥的预兆。 果然&#xff0c;刚刚上岛&#xff0c;就遭到古怪的兰狐的袭击&#xf…

华为在爱尔兰增设150个LTE研发职位

据国外媒体报道中国电信和网络跨国公司华为技术预计将在未来两年内在爱尔兰增设150个职位。华为公司目前设在爱尔兰都柏林、阿斯隆和科克的业务处共有50名员工。现在&#xff0c;公司已经投标竞购牌照&#xff0c;目的是为在爱尔兰推出第四代宽带进行基础设施开发。华为公司爱尔…

Java EE 7 / JAX-RS 2.0 – REST上的CORS

Java EE REST应用程序通常在开箱即用的开发机器上运行良好&#xff0c;该开发机器上所有服务器端资源和客户端UI均指向“ localhost”或127.0.0.1。 但是&#xff0c;当涉及跨域部署时&#xff08;当REST客户端不再与托管REST API的服务器位于同一域时&#xff09;&#xff0c;…

jQuery框架-1.jQuery基础知识

jQuery简介 jQuery&#xff0c;顾名思义是JavaScript和查询&#xff08;Query&#xff09;&#xff0c;jQuery是免费、开源的。它可以简化查询DOM对象、处理事件、制作动画、处理Ajax交互过程且兼容多浏览器的javascript库&#xff0c;核心理念是write less,do more(写得更少,…

用CornerStone配置SVN,HTTP及svn简单使用说明

原文地址&#xff1a;&#xff1a;&#xff1a;http://my.oschina.net/joanfen/blog/194491#OSC_h2_3 一、下载地址二、安装破解方法三、添加repository 1.SVN配置 2.HTTP配置四、使用简介 1.上传项目到repository 2.下载项目 3.版本管理 a)先更新后提交 b)完成独立功…

联系随笔2---在tomcat服务器上发布servlet应用程序

问题二&#xff1a;在tomcat服务器上发布servlet应用程序 1,new->Dynamic Web Project写工程名字->next->next在Generate web.xml文件上打勾勾->finish. 2&#xff0c;在工程名字上&#xff0c;new->servlet。在create Servlet对话框中填写java package包名字和…

Apache Lucene 5.0.0即将发布!

终于&#xff0c;在一系列强大的4.x功能&#xff08;最近是4.10.2&#xff09;发布之后&#xff0c;我们终于在努力开发另一个主要的Apache Lucene版本&#xff01; 没有确切时间的承诺&#xff08;完成时就完成了&#xff01;&#xff09;&#xff0c;但是我们已经有一个自愿…

从零开始学习前端开发 — 15、CSS3过渡、动画

一、css3过渡 语法&#xff1a; transition: 过渡属性 过渡时间 延迟时间 过渡方式; 1.过渡属性(transition-property) 取值&#xff1a;all 所有发生变化的css属性都添加过渡 eg: transition: all 1s; ident 指定要过渡的css属性列表 eg: transition:border-radius 1s,back…

CentOS6.4 Install FTP

目录 安装参考传输模式遇到无法显示远程文件夹报错安装参考 https://www.cnblogs.com/walblog/articles/7890226.html 传输模式 主动模式被动模式遇到无法显示远程文件夹报错 点击属性设置&#xff1a; 搞定。 转载于:https://www.cnblogs.com/mysticbinary/articles/11271647.…