最近在寫乙個專案的時候遇到乙個這樣乙個問題,我簡單的還原一下場景,這是模擬乙個簡單的管理系統
① 一張簡單的客戶表
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...