国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

別再用 “! = null” 做判空了!

來源: 責編: 時間:2023-09-18 21:41:59 371觀看
導讀問題為了避免空指針調用,我們經常會看到這樣的語句:...if (someobject != null) { someobject.doCalc();}...最終,項目中會存在大量判空代碼,丑陋繁雜。。。如何避免這種情況?是否濫用了判空?精華回答這是初、中級程序猿

問題

為了避免空指針調用,我們經常會看到這樣的語句:T5R28資訊網——每日最新資訊28at.com

...if (someobject != null) {    someobject.doCalc();}...

T5R28資訊網——每日最新資訊28at.com

最終,項目中會存在大量判空代碼,丑陋繁雜。。。如何避免這種情況?是否濫用了判空?T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

精華回答

T5R28資訊網——每日最新資訊28at.com

這是初、中級程序猿經常會遇到的問題。他們總喜歡在方法中返回null,因此,在調用這些方法時,也不得不去判空。另外,也許受此習慣影響,他們總潛意識地認為,所有的返回都是不可信任的,為了保護自己程序,就加了大量的判空。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

吐槽完畢,回到這個題目本身:T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

進行判空前,請區分以下兩種情況:T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

  1. null 是一個有效有意義的返回值(Where null is a valid response in terms of the contract; and)
  2. null是無效有誤的(Where it isn't a valid response.)

T5R28資訊網——每日最新資訊28at.com

你可能還不明白這兩句話的意思,不急,繼續往下看,接下來將詳細討論這兩種情況T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

先說第2種情況

T5R28資訊網——每日最新資訊28at.com

null就是一個不合理的參數,就應該明確地中斷程序,往外拋錯誤。這種情況常見于api方法。例如你開發了一個接口,id是一個必選的參數,如果調用方沒傳這個參數給你,當然不行。你要感知到這個情況,告訴調用方“嘿,哥們,你傳個null給我做甚"。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

相對于判空語句,更好的檢查方式有兩個:T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

  • assert語句,你可以把錯誤原因放到assert的參數中,這樣不僅能保護你的程序不往下走,而且還能把錯誤原因返回給調用方,豈不是一舉兩得。(原文介紹了assert的使用,這里省略)
  • 也可以直接拋出空指針異常。上面說了,此時null是個不合理的參數,有問題就是有問題,就應該大大方方往外拋。

T5R28資訊網——每日最新資訊28at.com

第1種情況會更復雜一些。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

這種情況下,null是個”看上去“合理的值,例如,我查詢數據庫,某個查詢條件下,就是沒有對應值,此時null算是表達了“空”的概念。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

這里給一些實踐建議:

T5R28資訊網——每日最新資訊28at.com

假如方法的返回類型是collections,當返回結果是空時,你可以返回一個空的collections(empty list),而不要返回null,這樣調用側就能大膽地處理這個返回,例如調用側拿到返回后,可以直接print list.size(),又無需擔心空指針問題。(什么?想調用這個方法時,不記得之前實現該方法有沒按照這個原則?所以說,代碼習慣很重要!如果你養成習慣,都是這樣寫代碼(返回空collections而不返回null),你調用自己寫的方法時,就能大膽地忽略判空)T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

返回類型不是collections,又怎么辦呢?T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

那就返回一個空對象(而非null對象),下面舉個“栗子”,假設有如下代碼:T5R28資訊網——每日最新資訊28at.com

public interface Action {  void doSomething();} public interface Parser {  Action findAction(String userInput);}

T5R28資訊網——每日最新資訊28at.com

其中,Parse有一個接口FindAction,這個接口會依據用戶的輸入,找到并執行對應的動作。假如用戶輸入不對,可能就找不到對應的動作(Action),因此findAction就會返回null,接下來action調用doSomething方法時,就會出現空指針。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

解決這個問題的一個方式,就是使用Null Object pattern(空對象模式)。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

改造后

T5R28資訊網——每日最新資訊28at.com

類定義如下,這樣定義findAction方法后,確保無論用戶輸入什么,都不會返回null對象:T5R28資訊網——每日最新資訊28at.com

public class MyParser implements Parser {  private static Action DO_NOTHING = new Action() {    public void doSomething() { /* do nothing */ }  };   public Action findAction(String userInput) {    // ...    if ( /* we can't find any actions */ ) {      return DO_NOTHING;    }  }}

T5R28資訊網——每日最新資訊28at.com

對比下面兩份調用實例:T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

  • 冗余:每獲取一個對象,就判一次空
Parser parser = ParserFactory.getParser();if (parser == null) {  // now what?  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {  // do nothing} else {
  • 精簡
ParserFactory.getParser().findAction(someInput).doSomething();

無論什么情況,都不會返回空對象,因此通過findAction拿到action后,可以放心地調用action的方法。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

其他回答精選:

T5R28資訊網——每日最新資訊28at.com

(1) 如果要用equal方法,請用object<不可能為空>.equal(object<可能為空>)),例如使用:T5R28資訊網——每日最新資訊28at.com

"bar".equals(foo)

而不是:T5R28資訊網——每日最新資訊28at.com

foo.equals("bar")

T5R28資訊網——每日最新資訊28at.com

(2) Java8或者guava lib中,提供了Optional類,這是一個元素容器,通過它來封裝對象,可以減少判空。不過代碼量還是不少。不爽。T5R28資訊網——每日最新資訊28at.com

T5R28資訊網——每日最新資訊28at.com

(3) 如果你想返回null,請停下來想一想,這個地方是否更應該拋出一個異常。T5R28資訊網——每日最新資訊28at.com

本文鏈接:http://m.rrqrq.com/showinfo-26-10476-0.html別再用 “! = null” 做判空了!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 優化自動化接口測試:利用鉤子函數增強HTTP請求處理

下一篇: HashMap 的基礎結構,必須掌握!

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • 余承東:AI大模型技術的發展將會帶來下一代智能終端操作系統的智慧體驗

    8月4日消息,2023年華為開發者大會(HDC.Together)今天正式開幕,華為發布HarmonyOS 4、全新升級的鴻蒙開發套件、HarmonyOS Next開發者預覽版本等一系列
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
欧美aa在线视频| 青青国产91久久久久久| 日韩免费一区二区| 欧美曰成人黄网| 一本一本久久a久久精品综合麻豆| 99亚洲精品| 亚洲毛片网站| 国产毛片一区| 久久高清免费观看| 久久成人免费| 91福利小视频| 欧美区在线观看| 日韩一区二区三区免费看| 欧美日本高清视频在线观看| 欧美二区三区91| 欧美不卡激情三级在线观看| 精品国产免费人成在线观看| 精品久久久久久久久久久久久久久| 日韩欧美aaaaaa| 国产亚洲精品久| 国产精品成人一区二区三区夜夜夜| 日本一区二区三区四区| **性色生活片久久毛片| 一区二区三区免费在线观看| 无码av中文一区二区三区桃花岛| 日韩精品一二三| 国产河南妇女毛片精品久久久| 粉嫩高潮美女一区二区三区 | 丝袜a∨在线一区二区三区不卡| 日产国产高清一区二区三区| 国产在线播放一区三区四| 高清在线观看日韩| 国产精品vip| 一本久道中文字幕精品亚洲嫩| 5858s免费视频成人| 久久亚洲影视婷婷| 尤物av一区二区| 免费高清不卡av| 91在线观看成人| 激情久久久久久| 欧美在线观看一区二区| www国产成人免费观看视频 深夜成人网| 国产精品―色哟哟| 天堂在线亚洲视频| 成人av资源网站| 国产乱人伦精品一区二区| 欧美日本一区二区在线观看| 日韩女优av电影在线观看| 亚洲免费观看在线视频| 国产真实乱子伦精品视频| 欧美在线影院| 欧美亚洲国产bt| 国产精品无码永久免费888| 亚洲 欧美综合在线网络| 成人av资源在线| 久久精品日产第一区二区 | 亚洲国产精品久久久久婷婷884 | 欧美日韩免费在线视频| 国产精品久久久久影院老司| 麻豆久久久久久久| 国产精品av久久久久久麻豆网| 久久综合给合久久狠狠色| 久久人人超碰精品| 日韩专区在线视频| 欧美日韩亚洲一区二区三区在线 | 激情久久五月| 欧美成人a∨高清免费观看| 亚洲一区二区美女| 欧美 日韩 国产一区二区在线视频| 久久综合久久久| 国产精品欧美极品| 国产成人自拍网| 日本二三区不卡| 亚洲品质自拍视频| 97se亚洲国产综合自在线不卡 | 欧美一区二区三区系列电影| 亚洲国产精品久久久久秋霞影院 | 欧美精品成人| 日韩一区二区三区观看| 婷婷综合五月天| 亚洲国产片色| 欧美国产精品一区二区三区| 国产成人精品免费一区二区| 六月天综合网| 亚洲人成亚洲人成在线观看图片| 成人av在线资源网站| 欧美精品在欧美一区二区少妇| 亚洲午夜三级在线| 亚洲日本无吗高清不卡| 国产亚洲欧美日韩在线一区| 成人午夜私人影院| 制服.丝袜.亚洲.中文.综合| 日韩精品三区四区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲天堂福利av| 欧美日韩综合久久| 中文字幕欧美国产| 色综合天天综合在线视频| 精品粉嫩超白一线天av| 成人网男人的天堂| 欧美成人性福生活免费看| 国产精品夜夜爽| 91精品国产免费| 国产丶欧美丶日本不卡视频| 666欧美在线视频| 国产91在线观看| 精品久久久三级丝袜| 99久免费精品视频在线观看| 91麻豆精品91久久久久同性| 国产麻豆一精品一av一免费| 欧美日韩电影在线播放| 黄色成人免费在线| 欧美一区二区三区在线视频| 高清国产一区二区| 久久久一区二区三区捆绑**| 91色porny蝌蚪| 1000部国产精品成人观看| 亚洲免费播放| 婷婷久久综合九色综合绿巨人| 色综合久久88色综合天天免费| 日韩1区2区3区| 日韩限制级电影在线观看| 成+人+亚洲+综合天堂| 久久精品欧美日韩精品| 国内精品亚洲| 亚洲五月六月丁香激情| 久久另类ts人妖一区二区| 精一区二区三区| 日韩一区二区在线免费观看| 99国产精品久久久久| 国产精品国产三级国产| 美女视频一区免费观看| 精品一区二区三区的国产在线播放| 欧美一级欧美一级在线播放| 欧美jjzz| 亚洲电影一级片| 日韩一区二区三区四区| 国产综合第一页| 日韩国产欧美视频| 日韩精品一区二区三区三区免费| 91捆绑美女网站| 午夜免费久久看| 在线成人免费观看| 欧美少妇一区| 免费av网站大全久久| xvideos.蜜桃一区二区| 一区二区冒白浆视频| 久久精品免费观看| 亚洲国产精品成人久久综合一区| 亚洲一区二区三区午夜| 国产成人鲁色资源国产91色综| 亚洲欧洲美洲综合色网| 在线看不卡av| 欧美日韩免费| 麻豆精品国产传媒mv男同| 国产性做久久久久久| 香蕉视频成人在线观看| 岛国精品在线播放| 亚洲图片有声小说| 欧美xxxxx裸体时装秀| 国产欧美一区二区三区国产幕精品| 久久精品国产99久久6| 国产欧美日韩视频在线观看| 日本韩国精品一区二区在线观看| 欧美精品一级| 国产一区二区三区香蕉| 亚洲欧美成aⅴ人在线观看| 日韩视频免费直播| 男女精品网站| 欧美色欧美亚洲另类七区| 国产美女av一区二区三区| 亚洲一区二区三区中文字幕| 26uuuu精品一区二区| 欧美日韩一区久久| 国产精品一区视频| 99精品在线免费| 韩国成人精品a∨在线观看| 亚洲特黄一级片| 2019国产精品| 欧美精品在线一区二区| 久久久精品动漫| 精品999成人| 99精品热视频| 国产成人免费视| 国产真实精品久久二三区| 亚洲电影中文字幕在线观看| 国产精品国产三级国产aⅴ原创| 欧美一级二级三级蜜桃| 欧美伊人久久大香线蕉综合69| 亚洲免费在线精品一区| 亚洲欧洲一区| 国产精品草草| 欧美啪啪一区| 欧美在线亚洲| 午夜国产精品视频免费体验区| 国产99久久久国产精品| 国产一区二区视频在线播放| 免费看日韩a级影片| 日日摸夜夜添夜夜添亚洲女人| 亚洲精品国产成人久久av盗摄|