一、 对象判空
if (obj != null) {
// 进行对象非空判断
}
Object obj = null; // 或者 obj = new Object();
if (obj == null) {
// 对象为空
}
另外,Guava 库还提供了一个更方便的方法,使用方式如下:
import com.google.common.base.Objects;
if (Objects.isNull(obj)) {
// 对象为空
}
二、 字符串判空
List<String> list = new ArrayList<>();
if (list == null || list.size() == 0) {
// list 为空
}
简单,但需要写太多代码判断,会显得有些麻烦。或 使用 Apache Commons Lang3 提供的 判断字符串是否为空或者只包含空格字符。这种方式使用起来非常方便:
import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
// 字符串为空
}
还可采用 Java 8 引入的 String#isEmpty()
方法判断字符串是否为空字符串:
if (str == null || str.isEmpty()) {
// 字符串为空
}
还有 Java 11 引入的 String#isBlank()
方法判断字符串是否为空或者只包含空格字符:
if (str == null || str.isBlank()) {
// 字符串为空
}
若还要 判断字符串是否为空或null:
String str = null; // 或者 str = "";
if (str == null || str.length() == 0 || str.trim().length() == 0) {
// 字符串为空或null
}
也可以使用 Apache Commons Lang3 库中的 StringUtils 工具类中的 isBlank() 方法进行判断:
import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
// 字符串为空或null或只包含空白字符
}
直接使用 == 判断是否为 null,或使用 equals() 判断是否等于空字符串 "":
String str = null;
if (str == null || str.equals("")) {
// 字符串为空
}
使用 isEmpty() 方法判断字符串是否为空字符串 "":
String str = "";
if (str.isEmpty()) {
// 字符串为空
}
使用 isBlank() 方法判断字符串是否为空或全是空格:
String str = " ";
if (StringUtils.isBlank(str)) {
// 字符串为空或全是空格
}
使用正则表达式判断字符串是否为空或只包含空格:
String str = " ";
if (str.matches("\\s*")) {
// 字符串为空或只包含空格
}
需要注意的是,第三种方法需要导入 StringUtils 类,而第四种方法虽然不需要导入任何类,但比较麻烦,建议使用前三种方法中的一种。
三、 List 判空
使用 if (list == null || list.isEmpty())
判断 List 是否为 null 或者是否为空列表。或使用 Java 8 引入的 isEmpty()
方法判断 List 是否为 null 或者是否为空列表:但注意 isEmpty()
方法只会判断集合是否为空,而不会判断集合是否为 null。因此,使用 Collection#isEmpty()
方法之前,要先判断集合是否为 null。如果为 null,则该方法会抛出空指针异常。正确的使用方法如下:
List<Object> list = ...;
if (list != null && !list.isEmpty()) { // 先判断 list 是否为 null,再判断 list 是否为空
// 进行操作
}
if (list == null || list.isEmpty()) {
// List 为空
}
上述代码中,先使用 list!=null
来判断 list 是否为 null,如果是,则不会进入条件语句中。如果不是,则使用 !list.isEmpty()
来判断 list 是否为空,如果不为空,则进入条件语句中进行操作。
四、Map 判空
Map<String, String> map = null; // 或者 map = new HashMap<>();
if (map == null || map.isEmpty()) {
// Map为空或null
}
private void putInfoToMap(Map<String,String> map ,String key ,String value){
if(StringUtils.isEmpty(key)){
return;
}
if(StringUtils.isEmpty(value)){
map.put(key, " ");
}else{
map.put(key, value);
}
}
五、数组判空
String[] array = null; // 或者 array = new String[10];
if (array == null || array.length == 0) {
// 数组为空或null
}
六、Set判空
Set<String> set = null; // 或者 set = new HashSet<>();
if (set == null || set.isEmpty()) {
// Set为空或null
}
在判断集合、数组、对象是否为空时,进行非空判断时最好先判断对象是否存在,否则在对象不存在的情况下操作对象可能会导致空指针异常的发生。
七、文件判空
public SalaryExcelOperatVo uploadExcel(MultipartFile multipartFile) {
if (multipartFile==null) {
log.error("文件不能为空");
throw new RuntimeException("上传Excel文件内容为空,请重新上传!");
}
String fileName = multipartFile.getOriginalFilename();
//判断文件是否是excel文件
assert fileName != null;
if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
log.error(fileName + "不是Excel文件!");
throw new RuntimeException(fileName + "不是Excel文件!");
}
//保存文件到本地
File dir1 = new File("/roots/uploadFile/xzExcel");
if (!dir1.exists()) {
dir1.mkdirs();
}
//统一日期格式
LocalDateTime current = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = current.format(formatter);
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
File file1 = new File(dir1.getAbsolutePath() + File.separator + formatted + "-" + end3 + "-" + multipartFile.getOriginalFilename());
try {
multipartFile.transferTo(file1);
} catch (IOException e) {
e.printStackTrace();
}
log.info("【上传薪资Excel文件已保存到本地:{}】",file1.getAbsolutePath());
//创建返回对象SalaryExcelOperatVo的实例化对象: result
SalaryExcelOperatVo result = new SalaryExcelOperatVo();
//获取excel文件sheet1 的内容
ArrayList<InSalary> inSalaries1 = readExcel1(file1.getAbsolutePath());
ArrayList<SalaryStaffPerOneListVo> vo1 = new ArrayList<>();
SalaryStaffPerOneListVo oneListVo ;
for(InSalary inSalary1:inSalaries1){
oneListVo = new SalaryStaffPerOneListVo();
BeanUtils.copyProperties(inSalary1,oneListVo);
vo1.add(oneListVo);
}
result.setSheetOne(vo1);
//获取excel文件sheet2 的内容
ArrayList<InSalary> inSalaries2 = readExcel2(file1.getAbsolutePath());
ArrayList<SalaryStaffPerTwoListVo> vo2 = new ArrayList<>();
SalaryStaffPerTwoListVo twoListVo ;
for(InSalary inSalary2:inSalaries2){
twoListVo = new SalaryStaffPerTwoListVo();
BeanUtils.copyProperties(inSalary2,twoListVo);
vo2.add(twoListVo);
}
result.setSheetTwo(vo2);
return result;
}
八、StringUtils 工具类
StringUtils 提供了许多字符串操作相关的方法,其中比较常用的包括 isEmpty、isNotEmpty、isBlank 和 isNotBlank,它们的作用如下:
- isEmpty:判断字符串是否为 null 或长度是否为 0;
- isNotEmpty:判断字符串是否不为 null 且长度不为 0;
- isBlank:判断字符串是否为 null、空字符串或全为空格字符;
- isNotBlank:判断字符串是否不为 null、不为空字符串且不全为空格字符。
isEmpty 和 isNotEmpty 是根据字符串的长度来判断的,而 isBlank 和 isNotBlank 还包括对空格字符的处理。另外,如果字符串为 null,无论使用哪个方法都会返回 true。
以下是 StringUtils.isEmpty、StringUtils.isNotEmpty、StringUtils.isBlank 和 StringUtils.isNotBlank 的源码实现(相对简化),可以更好地理解它们的区别:
public class StringUtils {
// 判断字符串是否为空(长度是否为 0)
public static boolean isEmpty(CharSequence cs) {
return cs == null || cs.length() == 0;
}
// 判断字符串是否不为空(长度是否不为 0)
public static boolean isNotEmpty(CharSequence cs) {
return !isEmpty(cs);
}
// 判断字符串是否为空白(包括 null、空字符串和全为空格字符)
public static boolean isBlank(CharSequence cs) {
int length;
if (cs == null || (length = cs.length()) == 0) {
return true;
}
for (int i = 0; i < length; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
// 判断字符串是否不为空白(不包括 null、空字符串和全为空格字符)
public static boolean isNotBlank(CharSequence cs) {
return !isBlank(cs);
}
}
private void validChoiceInfo(InSalary data, AnalysisContext context) {
if(isBlank(data.getUserName())){
throw new ExcelAnalysisException(String.format("上传失败:第%s行员工姓名为空",context.readRowHolder().getRowIndex()));
}
if(isBlank(data.getIdNumber())){
throw new ExcelAnalysisException(String.format("上传失败:第%s行员工身份证信息为空",context.readRowHolder().getRowIndex()));
}
}
private void validChoiceInfo(InSalary data, AnalysisContext context) {
if(StrUtil.isBlank(data.getUserName())){
throw new ExcelAnalysisException(String.format("上传失败:第%s行员工姓名为空",context.readRowHolder().getRowIndex()));
}
if(StrUtil.isBlank(data.getIdNumber())){
throw new ExcelAnalysisException(String.format("上传失败:第%s行员工身份证信息为空",context.readRowHolder().getRowIndex()));
}
}
这两段代码实现的功能是一样的,都是对员工姓名和身份证信息进行非空判断,并在为空的情况下抛出异常。不同之处在于第一段代码使用了 isBlank() 方法,而第二段则使用了 StrUtil.isBlank() 方法。isBlank() 方法是在 JDK 11 中新增的,能够判断字符串是否为空或全为空格,因此不需要再使用 trim() 方法进行判断。而 StrUtil.isBlank() 方法是在 Hutool 库中提供的,功能与 isBlank() 类似,但需要将 Hutool 库引入项目中才能使用。另外,两段代码还有一个细微的差别。第一段代码使用了 if(isBlank(data.getUserName())) 的形式进行判断,而第二段代码使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。这两种写法的效果是一样的,只是调用方法的方式略有不同。
或者自定义一个判空工具类(根据具体具体业务逻辑可以进行修改)
import java.util.Collection;
import java.util.Map;
public class NotNullCheck {
public NotNullCheck() {
}
public static boolean str(String str) {
return str != null && !str.isEmpty() && str.length() >= 1 && !"".equals(str.replaceAll(" ", ""));
}
public static boolean array(Collection list) {
return list != null && !list.isEmpty() && list.size() != 0;
}
public static boolean map(Map map) {
return map != null && !map.isEmpty() && map.size() != 0;
}
}