Java判空的一些常見方法
一、 對(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)單,但需要寫太多代碼判斷,會(huì)顯得有些麻煩。或 使用 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 庫(kù)中的 StringUtils 工具類中的 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 類,而第四種方法雖然不需要導(dǎo)入任何類,但比較麻煩,建議使用前三種方法中的一種。三、 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 來判斷 list 是否為 null,如果是,則不會(huì)進(jìn)入條件語句中。如果不是,則使用 !list.isEmpty() 來判斷 list 是否為空,如果不為空,則進(jìn)入條件語句中進(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 工具類
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)度來判斷的,而 isBlank 和 isNotBlank 還包括對(duì)空格字符的處理。另外,如果字符串為 null,無論使用哪個(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() 類似,但需要將 Hutool 庫(kù)引入項(xiàng)目中才能使用。另外,兩段代碼還有一個(gè)細(xì)微的差別。第一段代碼使用了 if(isBlank(data.getUserName())) 的形式進(jìn)行判斷,而第二段代碼使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。這兩種寫法的效果是一樣的,只是調(diào)用方法的方式略有不同。
總結(jié)
到此這篇關(guān)于Java判空的一些常見方法的文章就介紹到這了,更多相關(guān)Java判空方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot請(qǐng)求響應(yīng)方式示例詳解
這篇文章主要介紹了SpringBoot請(qǐng)求響應(yīng)的相關(guān)操作,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
Jmeter自定義函數(shù)base64加密實(shí)現(xiàn)過程解析
這篇文章主要介紹了Jmeter自定義函數(shù)base64加密實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
idea中導(dǎo)入別人的springboot項(xiàng)目的方法(圖文)
這篇文章主要介紹了idea中導(dǎo)入別人的springboot項(xiàng)目的方法(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java對(duì)象的XML序列化與反序列化實(shí)例解析
這篇文章主要介紹了Java對(duì)象的XML序列化與反序列化實(shí)例解析,小編覺得還是挺不錯(cuò)的,這里分享給大家。2017-10-10
使用Java實(shí)現(xiàn)Navicat密碼的加密與解密的代碼解析
這篇文章主要介紹了使用Java實(shí)現(xiàn)Navicat密碼的加密與解密,通過本文,我們了解了如何利用Java語言實(shí)現(xiàn)對(duì)Navicat保存的數(shù)據(jù)庫(kù)密碼進(jìn)行加密和解密,需要的朋友可以參考下2025-05-05
java?啟動(dòng)參數(shù)?springboot?idea詳解
這篇文章主要介紹了java?啟動(dòng)參數(shù)?springboot?idea的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
這篇文章主要介紹了Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

