判斷List集合為空還是null的正確開啟方式

2021-09-28 16:36:30 字數 2946 閱讀 8810

最近在寫乙個專案的時候遇到乙個這樣乙個問題,我簡單的還原一下場景,這是模擬乙個簡單的管理系統

① 一張簡單的客戶表

create table customer(

id int(11) not null auto_increment unique,

name varchar(255) not null,

gender varchar(255) not null,

phonenumber varchar(255) not null,

balance decimal(10,1) unsigned,

primary key (id)

);

② customerservice 層中的 updatebalance 方法

/**

* 通過id以及name欄位查詢使用者資訊

* @param id

* @param name

* @return

*/public list

querybyidandname

(string id,string name)

catch

(sqlexception e)

}

③ 呼叫

public

static

void

test()

else

}public

static

void

updatebalance

(string id, bigdecimal consumptionamount, boolean type)

else

}

注意:省略了dao層以及實體層等具體**,同時對**做了一定修改以及簡化,旨在還原問題,如有紕漏請見諒

我們可以看到真正的消費扣款或者存款 是在這一句中被執行的updatebalance(input_id, bd, false);,但是在執行對用餘額的修改操作之前,我們需要對使用者的身份進行核實,即通過list = cs.querybyidandname(input_id,input_name());這一句進行校驗,只有滿足id和name在sql中查詢,可以得到返回值則校驗通過,進行下一步消費操作,所以我在test()方法中增添乙個if判斷 判斷 list 的值是否為空

但是!每一次執行,無論卡號以及姓名輸入是否正確,對金額的修改操作總會執行,這讓我百思不得其解

我們service中的**是這樣的

try

catch

(sqlexception e)

查得到,返回乙個使用者資訊集合,查不到則返回null

所以在list的判斷中,我理所當然的使用了 if (list != null) 這樣乙個判斷條件,而問題恰恰出現在這裡

集合為空:集合內沒有元素,即為空

null:沒有對 list 集合分配空間,即未例項化

你可以這樣理解,逢時過節,鍋裡在煮餃子,你只有你的碗,在等餃子熟,所以此時你的碗中沒有任何餃*,也就是集合為空的概念,但是如果你連碗都沒拿,這個時候你就必須拿了碗,(分配了空間),餃子熟了你才有地方可以裝餃子,但是你如果沒有碗,就直接給你倒餃子,這個時候,就出現了空指標異常

總結:isempty() : 用於判斷list中元素是否為空,必須在已經分配記憶體空間的前提下,否則報出異常

== null : 用於判斷 list 集合是否已經被分配記憶體空間

list.size() == 0 : 與 isempty() 方法效果一致,但更推薦使用 isempty()

簡單**證明:

arraylist

list = null;

system.out.

println

(null == list)

;//返回 true

system.out.

println

(list.

isempty()

);// 空指標異常

例項化後的情況

arraylist

list =

newarraylist

();system.out.

println

(list.

isempty()

);//返回 true

system.out.

println

(list == null)

;//返回 false

由於我們將具體的 list例項化**寫在了daoimpl層中的具體實現中listcustormer = new arraylist<>();,所以執行校驗方法後,實際上list已經被例項化了,所以如果使用list != null來進行判斷,這就會導致一直返回 true,所以我們將判斷語句改為if ( !list.isempty())就可以了

那麼在我們實際開發中可以這樣搭配,先判斷是否已經分配空間,防止isempty判空時空指標異常,同時滿足集合中沒有元素

if

(list!= null &&

!list.

isempty()

)else

還有一種做法就是在service層中不返回null,而是返回乙個空的集合 (已經例項化)

仁者見仁,智者見智,你覺得呢?

雖然這個問題很基礎,但是確實讓我頭疼了好一陣,在開發的過程中,你遇到的一些莫名其妙的坑,往往來於自身對於基礎知識的掌握沒有很徹底,基礎無論到什麼時候,都是很重要啊!

List集合為null,導致其他操作報空指標異常。

原則 建立陣列物件或者乙個方法返回陣列時,不要賦值或返回null,而是返回空collection或者空陣列 這個技巧通過返回乙個空collection或者空陣列,可以確保在呼叫如size length 的時候不會因為空指標異常崩潰。collections類提供了方便的空list,set和map co...

怎麼判斷List集合是否為空

1.isempty 判斷list有沒有元素 而size 返回list有幾個元素,返回元素的個數 故 list.isempty 和list.size 0 沒有區別 建議判斷乙個集合有無元素 用isempty 方法.這個方法清晰,簡明,一目了然!2.這就相當與,你要喝水,首先使用以下語句生成水杯 use...

判斷是空物件還是空陣列

方法一 利用josn.stringify if json.stringify res.data else方法二objeck.keys objeck.keys 方法會返回乙個由給定物件的自身可列舉屬性組成的陣列,陣列中屬性名的排列順序和使用 for in 迴圈遍歷該物件時返回的順序一致,該方法屬於 e...