天天看點

c++ list判斷是否包含_判斷List集合為空還是null的正确打開方式問題解決 以及搭配方式

c++ list判斷是否包含_判斷List集合為空還是null的正确打開方式問題解決 以及搭配方式

事故場景還原

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

① 一張簡單的客戶表

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) {try {return new CustormerDaoImpl().queryByIdAndName(id, name);} catch (SQLException e) {e.printStackTrace();return null;}}
           

③ 調用

public static void test() { CustormerService cs = new CustormerService(); //使用者輸入的卡号和姓名,String類型,list在成員位置被定義list = cs.queryByIdAndName(input_id,input_name());if ( list != null) { //擷取充值或消費的金額數,這裡簡單用一個字元串模拟String str = input_money;BigDecimal bd = new BigDecimal(str); updateBalance(input_id, bd, false);}else {OptionPane.showMessageDialog(null, "沒有此使用者資訊");}}public static void updateBalance(String id, BigDecimal consumptionAmount, Boolean type) {CustormerService cs = new CustormerService();int back = cs.updateBalance(id, consumptionAmount, type);if (back == 0) { //我們用輸出語句,模拟具體的彈窗或者顯示的提示語System.out.println("消費成功");} else {System.out.println("消費失敗,請檢查餘額是否不足");}}
           

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

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

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

問題所在

我們Service中的代碼是這樣的

try {return new CustormerDaoImpl().queryByIdAndName(id, name);} catch (SQLException e) {e.printStackTrace();return null;}
           

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

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

集合為空還是null?

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

  • isEmpty:boolean isEmpty() : 如果此清單不包含元素,則傳回 true 。

null:沒有對 List 集合配置設定空間,即未執行個體化

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

總結:

  1. isEmpty() : 用于判斷List中元素是否為空,必須在已經配置設定記憶體空間的前提下,否則報出異常
  2. == null : 用于判斷 List 集合是否已經被配置設定記憶體空間
  3. list.size() == 0 : 與 isEmpty() 方法效果一緻,但更推薦使用 isEmpty()

簡單代碼證明:

  • 未執行個體化的情況
ArrayList list = null;System.out.println(null == list);//傳回 trueSystem.out.println(list.isEmpty());// 空指針異常
           
  • 執行個體化後的情況
ArrayList list = new ArrayList();System.out.println(list.isEmpty());//傳回 trueSystem.out.println(list == null);//傳回 false
           

問題解決 以及搭配方式

由于我們将具體的 List執行個體化代碼寫在了DaoImpl層中的具體實作中 List custormer = new ArrayList<>();,是以執行校驗方法後,實際上list已經被執行個體化了,是以如果使用 list != null來進行判斷,這就會導緻一直傳回 true,是以我們将判斷語句改為 if ( !list.isEmpty())就可以了

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

if(list!= null && !list.isEmpty()){   //不為空執行的代碼}else{   //為空執行的代碼}
           

還有一種做法就是在Service層中不傳回null,而是傳回一個空的集合 (已經執行個體化)

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

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

結尾:

如果文章中有什麼不足,或者錯誤的地方,歡迎大家留言分享想法,感謝朋友們的支援!

如果能幫到你的話,那就來關注我吧

最後,我自己是一名從事了多年開發的JAVA老程式員,今年年初我花了一個月整理了一份最适合2019年學習的java學習幹貨,可以送給每一位喜歡java的小夥伴,想要擷取的可以關注我的頭條号并在背景私信我:java,即可免費擷取。

作者:BWH_Steven

繼續閱讀