1. 判空的必要性
在Java开发中,NullPointerException是最常见的运行时异常之一。良好的判空习惯不仅能提高代码健壮性,还能减少生产环境中的意外错误。当函数缺少判空处理时,轻则导致接口报错,重则造成线程终止,影响系统稳定性。
然而,判空不仅仅是简单的obj != null
判断。在实际开发中,我们应当根据对象类型选择合适的判空方式。下面以String类型为例,介绍如何编写更健壮的判空代码。
2. String类型的判空处理
对于String类型的判空,推荐使用org.apache.commons.lang3.StringUtils
工具类。许多公司的内部工具类也是基于它开发的,它提供了更全面的字符串判空方法。
以下是StringUtils的典型用法示例:
ini
package com.ruoyi.web.testForArticle;
import org.apache.commons.lang3.StringUtils;
public class StringTest {
public static void main(String[] args) {
// String类型
String str = null;
String str1 = "";
String str2 = " ";
String str3 = " a ";
/**
* public static boolean isEmpty(CharSequence cs) {
* return cs == null || cs.length() == 0;
* }
*/
//判断是否为空,而且长度为1
if (StringUtils.isEmpty(str)){
System.out.println("str的isEmpty测试");
}
if (StringUtils.isEmpty(str1)){
System.out.println("str1的isEmpty测试");
}
/**
* public static boolean isBlank(CharSequence cs) {
* int strLen = length(cs);
* if (strLen == 0) {
* return true;
* } else {
* for(int i = 0; i < strLen; ++i) {
* //判断字符串里面的每一个字符是否为空格
* if (!Character.isWhitespace(cs.charAt(i))) {
* return false;
* }
* }
*
* return true;
* }
* }
*/
if (StringUtils.isBlank(str2)){
System.out.println("str2的isBlank测试");
}
if (StringUtils.isBlank(str3)){
System.out.println("str3的isBlank测试");
}
String str4 = null;
try {
str4.split("");
}catch (NullPointerException e){
e.printStackTrace();
}
String str5 = "Hello qwj";
//模拟常见的开发环境,从不知道哪里拿出来了一个字符串,我需要提取出qwj的字符
if (StringUtils.isNotEmpty(str5)){
String[] s = str5.split(" ");
System.out.println(s[1]);
}
String str6 = "\t\n\r"; // 制表符、换行符、回车符
System.out.println("str6 isBlank: " + StringUtils.isBlank(str6)); // true
System.out.println("str6 isEmpty: " + StringUtils.isEmpty(str6)); // false
String str7 = " hello ";
System.out.println("trim后判空: " + StringUtils.isEmpty(str7.trim())); // false
System.out.println("trim后判blank: " + StringUtils.isBlank(str7.trim())); // false
String str8 = null;
// 避免NPE的链式调用
int length = StringUtils.defaultIfEmpty(str8, "").length(); // 返回0
System.out.println("str8的安全长度: " + length);
// 场景:从用户输入或数据库获取可能为null的字符串
String userInput = null;
String safeInput = StringUtils.defaultString(userInput, "default");
System.out.println("处理后的输入: " + safeInput); // 输出 "default"
// 场景:拼接前的判空
String prefix = null;
String suffix = "World";
String result = StringUtils.join(prefix, suffix); // 自动跳过null
System.out.println("拼接结果: " + result); // 输出 "World"
}
}
txt
str的isEmpty测试
str1的isEmpty测试
str2的isBlank测试
qwj
str6 isBlank: true
str6 isEmpty: false
trim后判空: false
trim后判blank: false
str8的安全长度: 0
处理后的输入: default
拼接结果: World
java.lang.NullPointerException
at com.ruoyi.web.testForArticle.StringTest.main(StringTest.java:51)