Atitit避免出現空指針異常解決方案

来源:http://www.cnblogs.com/attilax/archive/2016/02/26/5222115.html
-Advertisement-
Play Games

Atitit避免出現空指針異常解決方案 1. Null的問題1 2. 強制區分一般引用vs 可空引用 vs 強制引用,或者說非空引用2 3. ?運算符(問號運算符) !感嘆號運算符避免出現空指針異常,2 4. Java 8中的Optional類2 4.1.1. 為什麼使用Optional要比常見的n


Atitit避免出現空指針異常解決方案

 

 

1Null的問題1

2強制區分一般引用vs 可空引用 vs 強制引用,或者說非空引用2

3?運算符(問號運算符) !感嘆號運算符避免出現空指針異常,2

4Java 8中的Optional2

4.1.1. 為什麼使用Optional要比常見的null檢查強?3

5另一個救星! Objects.requireNonNull3

5.1.1. 為什麼比if(myObj!=null)要好?3

6參考4

 

1. Null的問題

含空引用的編程語言是一個價值十億美元的錯誤(譯者註:圖靈獎得主 Tony Hoare 說過)。但是為什麼呢?當然,他們可能會導致NullReferenceException,但那又怎樣?只要使用不當,一個語言的任何一個元素都可導致錯誤啊

換句話說,有兩種情況會出現判空語句:

· null返回值按找約定是正常的返回值

· null返回值不是正常的返回值

第二種情況很簡單。可以使用assert來判斷或者是允許程式報錯(即拋NullPointerException)。斷言是一個被充分利用的Java特性,在1.4版本中加入了這個特性。語法如下:

NullPointerException最主要的問題是沒有一個biz 說明。

帶有說明的異常要比光禿禿的拋出一個NullPointerException要好的多。

作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 漢字名:艾龍,  EMAIL:[email protected]

轉載請註明來源: http://www.cnblogs.com/attilax/

 

 

2. 強制區分一般引用vs 可空引用 vs 強制引用,或者說非空引用

3.  ?運算符(問號運算符) !感嘆號運算符避免出現空指針異常,

的根源在於C#無法表達出非空引用的概念,這也導致讓編譯器強制進行空檢查變成一種過於繁重的任務。

為了應對這個問題,某條提議建議使用一種強制引用,以及一種明確的可空引用的定義。在提議中,可空引用將使用?尾碼進行定義,正如可空值類型的定義方式一樣。而強制引用,或者說非空引用將使用!尾碼進行定義。

強制引用以及可空引用都應該被視為一種僅限於語言本身的概念,它們只是改變了編譯器的行為,但不會改動所生成的IL代碼

在編譯器允許訪問可空引用對象的任何方法或屬性之前,必須明確地檢查空引用。並且在將某個可空引用轉型為強制引用之前,也必須對空引用進行檢查。

強制引用需要編譯器證實其中包含的值不可為空。由於這是一種僅限於編譯器的規則,因此無法保證在反序列化等場景中能夠同樣生效。

 

在閱讀這條提議的完整內容時,你會註意到其中提到的某個術語“一般引用”。它指的是C#中的普通引用,它既不是強制的,也不是明確定義為可空的。由於這種引用將被視為遺留代碼,因此可以通過AllowGeneralReferences這一屬性告訴編譯器不允許在代碼中使用一般引用。

在結合隱式變數定義時,可以在var關鍵字中使用!或?尾碼。

 

 

4. Java 8中的Optional

簡單的方法就是檢查Optional包裝器是否真的有值(使用isPresent方法)——你會懷疑這和使用if(myObj != null)相比有什麼好處。別擔心,這個我會解釋清楚的

你可以使用orElse方法,這樣萬一封裝的確實是一個null值的話可以用它來返回一個預設值——它的好處顯而易見。在提取出真實值的時候可以避免調用ifPresent方法這樣明顯多餘的方式了。

4.1.1. 為什麼使用Optional要比常見的null檢查強?

· 使用Optional最大的好處就是可以更明白地表述你的意圖——返回null值的話會讓消費者感到疑惑(當真的出現NPE的時候)這是不是故意返回的,因此還得查看javadoc來進一步定位。而使用Optional就相當明瞭了。

· 有了Optional你就可以徹底避免NPE了——如上所提,使用Optional.ofNullable,orElse以及orElseGet可以讓我們遠離NPE。

5. 另一個救星! Objects.requireNonNull

如果拋出NPE的話,我們怎麼能確定到底是哪個是null的?

Objects.requireNonNull(key, "Key is null");

 

requireNonNull方法

· 如果對象不為null的話就返回它本身

· 如果值為null的話,返回的NPE會帶有指定的消息

5.1.1. 為什麼比if(myObj!=null)要好?

你所看到的棧跟蹤信息會很清楚地看見Objects.requireNonNull的方法調用。這個再配合你自己的錯誤日誌,可以讓你更快地定位問題。。。至少在我看來是更快。

6. 參考

空指針的救星 - 博客 - 伯樂線上.htm

 

在Java中如何避免“!=null”式的判空語句? - ImportNew.htm

C#的未來:追蹤空引用.htm


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目地址:https://github.com/brianlmoon/GearmanManager PHP環境要求 PHP 5.5.9 POSIX extension Process Control extension pecl/gearman or Net_Gearman 使用GearmanMan
  • 原理:php預設擴展庫不含有redis擴展;要支持redis擴展,需要有redis.so這個擴展文件 所以我們的目標就是生成redis.so擴展文件,並修改php.ini 讓其支持redis擴展。 準備測試環境與軟體: Vm虛擬機; CentOS5.5(已搭建好LNMP環境); Redis-2.6.
  • 模塊概念:用一砣代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 模塊分為
  • 尊重原創,轉載來源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同數據類型的數據結構了,它已經獲取了太多的功能。struct能包含成員函數嗎? 能!struct
  • 首先下載安裝tomcat,在官網下載即可,目前的版本有最新的到tomcat9.0,但是在實際的開發過程中一般為tomcat7.0或者tomcat8.0,在這裡大部分為tomcat7.0,所以下載這個版本就可以了。在安裝過程中基本採取預設的安裝路徑即可,也可以自己指定安裝的路徑,安裝後要進行環境的配置
  • atitit.編程語言 類與對象的 擴展機制.doc 1.1. Java 下一代: 沒有繼承性的擴展1 1.2. 繼承1 1.3. 使用cglib動態為Java類添加方法1 1.4. 工具類 1 1.5. Wrap 包裝類 裝飾器模式2 1.6. 擴展方法 (其實就是工具類的語法糖)2 1.7. S
  • Atitit .c#的未來新特性計劃草案 1. C#的未來:追蹤空引用1 1.1. 2. 變數命名空間1 1.2. 10. 項目引用Native dll2 1.3. 10. 項目引用Native dll2 2. 三、設計面向 面向變數的彙編語言,高級語言出現後,從Pascal/C語言面向過程和變數,
  • atitit.groovy 語法特性 1. Groovy 1.6概覽1 1.1. 多路賦值2 2. 新發佈的Groovy2.0為這門語言帶來了關鍵的靜態特性:靜態類型檢查和靜態編譯;2 3. 參考3 增強的ast @log @field 3. 動態類型def6 4. 迴圈變數不需要def6 5. S
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...