Java判空的一些常見方法
一、 對象判空
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);
}
}

五、數(shù)組判空
String[] array = null; // 或者 array = new String[10];
if (array == null || array.length == 0) {
// 數(shù)組為空或null
}
六、Set判空
Set<String> set = null; // 或者 set = new HashSet<>();
if (set == null || set.isEmpty()) {
// Set為空或null
}在判斷集合、數(shù)組、對象是否為空時,進行非空判斷時最好先判斷對象是否存在,否則在對象不存在的情況下操作對象可能會導致空指針異常的發(fā)生。
七、文件判空
public SalaryExcelOperatVo uploadExcel(MultipartFile multipartFile) {
if (multipartFile==null) {
log.error("文件不能為空");
throw new RuntimeException("上傳Excel文件內(nèi)容為空,請重新上傳!");
}
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();
}
//統(tǒng)一日期格式
LocalDateTime current = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = current.format(formatter);
//加上三位隨機數(shù)
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());
//創(chuàng)建返回對象SalaryExcelOperatVo的實例化對象: result
SalaryExcelOperatVo result = new SalaryExcelOperatVo();
//獲取excel文件sheet1 的內(nèi)容
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 的內(nèi)容
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 是根據(jù)字符串的長度來判斷的,而 isBlank 和 isNotBlank 還包括對空格字符的處理。另外,如果字符串為 null,無論使用哪個方法都會返回 true。
以下是 StringUtils.isEmpty、StringUtils.isNotEmpty、StringUtils.isBlank 和 StringUtils.isNotBlank 的源碼實現(xiàn)(相對簡化),可以更好地理解它們的區(qū)別:
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()));
}
} 這兩段代碼實現(xiàn)的功能是一樣的,都是對員工姓名和身份證信息進行非空判斷,并在為空的情況下拋出異常。不同之處在于第一段代碼使用了 isBlank() 方法,而第二段則使用了 StrUtil.isBlank() 方法。isBlank() 方法是在 JDK 11 中新增的,能夠判斷字符串是否為空或全為空格,因此不需要再使用 trim() 方法進行判斷。而 StrUtil.isBlank() 方法是在 Hutool 庫中提供的,功能與 isBlank() 類似,但需要將 Hutool 庫引入項目中才能使用。另外,兩段代碼還有一個細微的差別。第一段代碼使用了 if(isBlank(data.getUserName())) 的形式進行判斷,而第二段代碼使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。這兩種寫法的效果是一樣的,只是調(diào)用方法的方式略有不同。
總結(jié)
到此這篇關于Java判空的一些常見方法的文章就介紹到這了,更多相關Java判空方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中@Conditional注解的介紹及實踐
在 Spring Boot 中,@Conditional 注解用于實現(xiàn) 條件化 Bean 裝配,本文將詳細介紹 @Conditional 相關的注解,并結(jié)合實際應用示例講解其使用方式,感興趣的小伙伴可以了解下2025-03-03
Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能
今天小編就為大家分享一篇關于Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能
這篇文章主要介紹了IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Java實現(xiàn)整合文件上傳到FastDFS的方法詳細
FastDFS是一個開源的輕量級分布式文件系統(tǒng),對文件進行管理,功能包括:文件存儲、文件同步、文件上傳、文件下載等,解決了大容量存儲和負載均衡的問題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下2022-02-02
SpringBoot實現(xiàn)Read Through模式的操作過程
Read Through模式通常是指一種緩存策略,其中當應用程序嘗試讀取數(shù)據(jù)時,緩存系統(tǒng)首先被檢查以查看數(shù)據(jù)是否已經(jīng)存在于緩存中,這篇文章主要介紹了SpringBoot實現(xiàn)Read Through模式,需要的朋友可以參考下2024-07-07
詳解Java分布式系統(tǒng)中session一致性問題
這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問題,對分布式系統(tǒng)感興趣的同學,要仔細看一下2021-04-04

