Java判空的一些常見(jiàn)方法
一、 對(duì)象判空
if (obj != null) { // 進(jìn)行對(duì)象非空判斷 } Object obj = null; // 或者 obj = new Object(); if (obj == null) { // 對(duì)象為空 }
另外,Guava 庫(kù)還提供了一個(gè)更方便的方法,使用方式如下:
import com.google.common.base.Objects; if (Objects.isNull(obj)) { // 對(duì)象為空 }
二、 字符串判空
List<String> list = new ArrayList<>(); if (list == null || list.size() == 0) { // list 為空 }
簡(jiǎn)單,但需要寫(xiě)太多代碼判斷,會(huì)顯得有些麻煩。或 使用 Apache Commons Lang3 提供的 判斷字符串是否為空或者只包含空格字符。這種方式使用起來(lái)非常方便:
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 庫(kù)中的 StringUtils 工具類(lèi)中的 isBlank() 方法進(jìn)行判斷:
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)) { // 字符串為空或全是空格 } 使用正則表達(dá)式判斷字符串是否為空或只包含空格: String str = " "; if (str.matches("\\s*")) { // 字符串為空或只包含空格 } 需要注意的是,第三種方法需要導(dǎo)入 StringUtils 類(lèi),而第四種方法雖然不需要導(dǎo)入任何類(lèi),但比較麻煩,建議使用前三種方法中的一種。
三、 List 判空
使用 if (list == null || list.isEmpty())
判斷 List 是否為 null 或者是否為空列表?;蚴褂?Java 8 引入的 isEmpty()
方法判斷 List 是否為 null 或者是否為空列表:但注意 isEmpty()
方法只會(huì)判斷集合是否為空,而不會(huì)判斷集合是否為 null。因此,使用 Collection#isEmpty()
方法之前,要先判斷集合是否為 null。如果為 null,則該方法會(huì)拋出空指針異常。正確的使用方法如下:
List<Object> list = ...; if (list != null && !list.isEmpty()) { // 先判斷 list 是否為 null,再判斷 list 是否為空 // 進(jìn)行操作 } if (list == null || list.isEmpty()) { // List 為空 }
上述代碼中,先使用 list!=null
來(lái)判斷 list 是否為 null,如果是,則不會(huì)進(jìn)入條件語(yǔ)句中。如果不是,則使用 !list.isEmpty()
來(lái)判斷 list 是否為空,如果不為空,則進(jìn)入條件語(yǔ)句中進(jìn)行操作。
四、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ù)組、對(duì)象是否為空時(shí),進(jìn)行非空判斷時(shí)最好先判斷對(duì)象是否存在,否則在對(duì)象不存在的情況下操作對(duì)象可能會(huì)導(dǎo)致空指針異常的發(fā)生。
七、文件判空
public SalaryExcelOperatVo uploadExcel(MultipartFile multipartFile) { if (multipartFile==null) { log.error("文件不能為空"); throw new RuntimeException("上傳Excel文件內(nèi)容為空,請(qǐng)重新上傳!"); } 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); //加上三位隨機(jī)數(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)建返回對(duì)象SalaryExcelOperatVo的實(shí)例化對(duì)象: 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 工具類(lèi)
StringUtils 提供了許多字符串操作相關(guān)的方法,其中比較常用的包括 isEmpty、isNotEmpty、isBlank 和 isNotBlank,它們的作用如下:
- isEmpty:判斷字符串是否為 null 或長(zhǎng)度是否為 0;
- isNotEmpty:判斷字符串是否不為 null 且長(zhǎng)度不為 0;
- isBlank:判斷字符串是否為 null、空字符串或全為空格字符;
- isNotBlank:判斷字符串是否不為 null、不為空字符串且不全為空格字符。
isEmpty 和 isNotEmpty 是根據(jù)字符串的長(zhǎng)度來(lái)判斷的,而 isBlank 和 isNotBlank 還包括對(duì)空格字符的處理。另外,如果字符串為 null,無(wú)論使用哪個(gè)方法都會(huì)返回 true。
以下是 StringUtils.isEmpty、StringUtils.isNotEmpty、StringUtils.isBlank 和 StringUtils.isNotBlank 的源碼實(shí)現(xiàn)(相對(duì)簡(jiǎn)化),可以更好地理解它們的區(qū)別:
public class StringUtils { // 判斷字符串是否為空(長(zhǎng)度是否為 0) public static boolean isEmpty(CharSequence cs) { return cs == null || cs.length() == 0; } // 判斷字符串是否不為空(長(zhǎng)度是否不為 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())); } }
這兩段代碼實(shí)現(xiàn)的功能是一樣的,都是對(duì)員工姓名和身份證信息進(jìn)行非空判斷,并在為空的情況下拋出異常。不同之處在于第一段代碼使用了 isBlank() 方法,而第二段則使用了 StrUtil.isBlank() 方法。isBlank() 方法是在 JDK 11 中新增的,能夠判斷字符串是否為空或全為空格,因此不需要再使用 trim() 方法進(jìn)行判斷。而 StrUtil.isBlank() 方法是在 Hutool 庫(kù)中提供的,功能與 isBlank() 類(lèi)似,但需要將 Hutool 庫(kù)引入項(xiàng)目中才能使用。另外,兩段代碼還有一個(gè)細(xì)微的差別。第一段代碼使用了 if(isBlank(data.getUserName())) 的形式進(jìn)行判斷,而第二段代碼使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。這兩種寫(xiě)法的效果是一樣的,只是調(diào)用方法的方式略有不同。
總結(jié)
到此這篇關(guān)于Java判空的一些常見(jiàn)方法的文章就介紹到這了,更多相關(guān)Java判空方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@Conditional注解的介紹及實(shí)踐
在 Spring Boot 中,@Conditional 注解用于實(shí)現(xiàn) 條件化 Bean 裝配,本文將詳細(xì)介紹 @Conditional 相關(guān)的注解,并結(jié)合實(shí)際應(yīng)用示例講解其使用方式,感興趣的小伙伴可以了解下2025-03-03Java多線程環(huán)境下使用的集合類(lèi)示例詳解
這篇文章主要給大家介紹了關(guān)于Java多線程環(huán)境下使用的集合類(lèi)的相關(guān)資料,開(kāi)發(fā)過(guò)程中經(jīng)常遇到這種需求,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Java自帶定時(shí)任務(wù)ScheduledThreadPoolExecutor實(shí)現(xiàn)定時(shí)器和延時(shí)加載功能
今天小編就為大家分享一篇關(guān)于Java自帶定時(shí)任務(wù)ScheduledThreadPoolExecutor實(shí)現(xiàn)定時(shí)器和延時(shí)加載功能,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12IDEA 2020 無(wú)法啟動(dòng)的解決辦法(啟動(dòng)崩盤(pán))附IDEA 2020 新功能
這篇文章主要介紹了IDEA 2020 無(wú)法啟動(dòng)的解決辦法(啟動(dòng)崩盤(pán))附IDEA 2020 新功能,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)
FastDFS是一個(gè)開(kāi)源的輕量級(jí)分布式文件系統(tǒng),對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件上傳、文件下載等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下2022-02-02SpringBoot實(shí)現(xiàn)Read Through模式的操作過(guò)程
Read Through模式通常是指一種緩存策略,其中當(dāng)應(yīng)用程序嘗試讀取數(shù)據(jù)時(shí),緩存系統(tǒng)首先被檢查以查看數(shù)據(jù)是否已經(jīng)存在于緩存中,這篇文章主要介紹了SpringBoot實(shí)現(xiàn)Read Through模式,需要的朋友可以參考下2024-07-07詳解Java分布式系統(tǒng)中session一致性問(wèn)題
這篇文章主要介紹了Java分布式系統(tǒng)中session一致性問(wèn)題,對(duì)分布式系統(tǒng)感興趣的同學(xué),要仔細(xì)看一下2021-04-04