日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java14發布了,再也不怕NullPointerException了

瀏覽:192日期:2022-09-03 16:34:49

2020年3月17日發布,Java正式發布了JDK 14 ,目前已經可以開放下載。在JDK 14中,共有16個新特性,本文主要來介紹其中的一個特性:JEP 358: Helpful NullPointerExceptions

null何錯之有?

對于Java程序員來說,null是令人頭痛的東西。時常會受到空指針異常(NullPointerException)的騷擾。相信很多程序員都特別害怕出現程序中出現NPE,因為這種異常往往伴隨著代碼的非預期運行。

在編程語言中,空引用(Null Reference)是一個與空指針類似的概念,是一個已宣告但其并未引用到一個有效對象的變量。

在Java 1 中就包含了了Null引用和NPE了,但是其實,Null引用是偉大的計算機科學家Tony Hoare 早在1965年發明的,最初作為編程語言ALGOL W的一部分。

1965年,英國一位名為Tony Hoare的計算機科學家在設計ALGOL W語言時提出了null引用的想法。ALGOL W是第一批在堆上分配記錄的類型語言之一。Hoare選擇null引用這種方式,“只是因為這種方法實現起來非常容易”。雖然他的設計初衷就是要“通過編譯器的自動檢測機制,確保所有使用引用的地方都是絕對安全的”,他還是決定為null引用開個綠燈,因為他認為這是為“不存在的值”建模最容易的方式。

但是在2009年,很多年后,他開始為自己曾經做過這樣的決定而后悔不已,把它稱為“一個價值十億美元的錯誤”。實際上,Hoare的這段話低估了過去五十年來數百萬程序員為修復空引用所耗費的代價。因為在ALGOL W之后出現的大多數現代程序設計語言,包括Java,都采用了同樣的設計方式,其原因是為了與更老的語言保持兼容,或者就像Hoare曾經陳述的那樣,“僅僅是因為這樣實現起來更加容易”。

Java14發布了,再也不怕NullPointerException了

相信很多Java程序員都一樣對null和NPE深惡痛絕,因為他確實會帶來各種各樣的問題(來自《Java 8 實戰》)。如:

它是錯誤之源。 NullPointerException是目前Java程序開發中最典型的異常。它會使你的代碼膨脹。 它讓你的代碼充斥著深度嵌套的null檢查,代碼的可讀性糟糕透頂。 它自身是毫無意義的。 null自身沒有任何的語義,尤其是是它代表的是在靜態類型語言中以一種錯誤的方式對缺失變量值的建模。 它破壞了Java的哲學。 Java一直試圖避免讓程序員意識到指針的存在,唯一的例外是:null指針。 它在Java的類型系統上開了個口子。 null并不屬于任何類型,這意味著它可以被賦值給任意引用類型的變量。這會導致問題, 原因是當這個變量被傳遞到系統中的另一個部分后,你將無法獲知這個null變量最初賦值到底是什么類型。

其他語言如何解決NPE問題

我們知道,出了Java語言外,還有很多其他的面向對象語言,那么在其他的一些語言中,是如何解決NPE的問題的呢?

如在Groovy中使用安全導航操作符(Safe Navigation Operator)可以訪問可能為null的變量:

def carInsuranceName = person?.car?.insurance?.name

Groovy的安全導航操作符能夠避免在訪問這些可能為null引用的變量時發生NullPointerException,在調用鏈中的變量遭遇null時將null引用沿著調用鏈傳遞下去,返回一個null。

其實這個功能曾經考慮過增加一個類似的功能,但是后來又被舍棄了。

另外,在Haskell和Scala也有類似的替代品,如Haskell中的Maybe類型、Scala中的Option[T]。

在 Kotlin 中,其類型系統嚴格區分一個引用可以容納 null 還是不能容納。也就是說,一個變量是否可空必須顯示聲明,對于可空變量,在訪問其成員時必須做空處理,否則無法編譯通過:

var a: String = 'abc'a = null // 編譯錯誤

果允許為空,可以聲明一個可空字符串,寫作 String?:

var b: String? = 'abc' //String? 表示該 String 類型變量可為空b = null // 編譯通過

看到這個?的時候,是不是發現和Groovy有點像?不過還是有一定區別的,這里就不展開了。

好了,書歸正傳,我們來看看作為一個TOIBE編程語言排行榜第一名的語言,Java語言對于NPE做出了哪些努力!

Java做了哪些努力

一直以來對于null和NPE的改進還是做出了一些努力的。

首先在Java 8中提供了Optional,其實在Java 8 推出之前,Google的Guava庫中就率先提供過Optional接口來使null快速失敗。

Optional在可能為null的對象上做了一層封裝,Optional對象包含了一些方法來顯式地處理某個值是存在還是缺失,Optional類強制你思考值不存在的情況,這樣就能避免潛在的空指針異常。

但是設計Optional類的目的并不是完全取代null,它的目的是設計更易理解的API。通過Optional,可以從方法簽名就知道這個函數有可能返回一個缺失的值,這樣強制你處理這些缺失值的情況。

關于Optional的用法,不是本文的重點,就不在這里詳細介紹了,筆者在日常開發中經常結合Stream一起使用Optional,還是比較好用的。

另外一個值得一提的就是最近(2020年03月17日)發布的JDK 14中對于NPE有了一個增強。那就是JEP 358: Helpful NullPointerExceptions

更有幫助的NPE

JDK 14中對于NEP有了一個增強,既然NPE暫時無法避免,那么就讓他對開發者更有幫助一些。

Java14發布了,再也不怕NullPointerException了

每個Java開發人員都遇到過NullPointerExceptions (NPEs)。由于NPEs可以發生在程序的幾乎任何地方,試圖捕獲并從它們中恢復通常是不切實際的。因此,開發人員通常依賴于JVM來確定NPE實際發生時的來源。例如,假設在這段代碼中出現了一個NPE:

a.i = 99;

JVM將打印出導致NPE的方法、文件名和行號:

Exception in thread 'main' java.lang.NullPointerExceptionat Prog.main(Prog.java:5)

通過以上堆棧信息,開發人員可以定位到a.i= 99這一行,并推斷出a一定是null。

但是,對于更復雜的代碼,如果不使用調試器,就不可能確定哪個變量是null。假設在這段代碼中出現了一個NPE:

a.b.c.i = 99;

我們根本無法確定到底是a還是b或者是c在運行時是個null值。

但是,在JDK14以后,這種窘境就有解了。

在JDK14中,當運行期,試圖對一個bull對象進行應用時,JVM依然會拋出一個NullPointerException (NPE),除此之外,還會通過通過分析程序的字節碼指令,JVM將精確地確定哪個變量是null,并且在堆棧信息中明確的提示出來。

在JDK 14中,如果上文中的a.i = 99發生NPE,將會打印如下堆棧:

Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'i' because 'a' is nullat Prog.main(Prog.java:5)

如果是a.b.c.i = 99;中的b為null導致了空指針,則會打印以下堆棧信息:

Exception in thread 'main' java.lang.NullPointerException: Cannot read field 'c' because 'a.b' is nullat Prog.main(Prog.java:5)

可見,堆棧中明確指出了到底是哪個對象為null而導致了NPE,這樣,一旦應用中發生NPE,開發者可以通過堆棧信息第一時間定位到到底是代碼中的那個對象為null導致的。

這算是JDK的一個小小的改進,但是這個改進對于開發者來說確實是非常友好的。真的希望這些小而美的改動可以在JDK中越來越多。

參考資料:

https://openjdk.java.net/jeps/358

《Java 8 In Action》

到此這篇關于Java14發布了,再也不怕NullPointerException了的文章就介紹到這了,更多相關Java14 NullPointerException內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂а√在线最新版中文在线| 欧美aa一级| 午夜精品成人av| 国产高清一区二区| 蘑菇福利视频一区播放| 四季av一区二区凹凸精品| 久久精品中文| 美女一区网站| 亚洲欧美久久精品| 亚洲精品麻豆| 蜜臀av一区二区在线免费观看 | 麻豆免费精品视频| 久久福利一区| 日韩视频一区| 亚洲精品123区| 久久国产99| 国产精东传媒成人av电影| 亚洲精品免费观看| 日韩精品一级二级| 欧美在线看片| 国产精品jk白丝蜜臀av小说| 美女少妇全过程你懂的久久| 久久久久欧美精品| 国产成人精品一区二区免费看京 | 精品日韩一区| 国产精品三级| 日韩av在线播放网址| 欧美专区一区二区三区| 日韩大片在线播放| 91精品国产成人观看| 日韩亚洲一区在线| 97精品一区| 国产精品亚洲欧美| 成人精品视频| 日韩精品91| 欧美亚洲精品在线| 欧美粗暴jizz性欧美20| 精品国产欧美| 亚洲天堂免费| 亚洲欧洲国产精品一区| 免费观看久久av| 99re国产精品| 日韩欧美中文字幕一区二区三区| 日韩欧美中文在线观看| 亚洲精品女人| 久久字幕精品一区| 韩国一区二区三区视频| 中文字幕人成乱码在线观看| 午夜av成人| 久久久久国产精品一区三寸| 欧美精品自拍| 日韩高清欧美| 一区二区三区四区日韩| 老司机精品在线| 99国产精品久久久久久久 | 亚洲免费播放| 国产精品极品在线观看| 成人在线观看免费视频| 国产农村妇女精品一区二区| 麻豆一区二区三区| 欧美一级专区| 高清在线一区| 日韩**一区毛片| 丝袜美腿一区| 国产精品久久777777毛茸茸| 在线午夜精品| 伊人网在线播放| 亚洲精品韩国| 中文字幕一区二区三区日韩精品 | 成人看片网站| 日韩中出av| 中文字幕亚洲影视| 丁香婷婷久久| 久久精品色播| 亚洲1234区| 亚洲精品三级| 久久精品色播| 奇米狠狠一区二区三区| 国产欧美一级| 国产乱论精品| 国产精品亚洲片在线播放| 成人av二区| 久久精品国产精品亚洲毛片| 日本美女一区| 免费成人性网站| 天堂网在线观看国产精品| 日本a级不卡| 国产精品永久| 2023国产精品久久久精品双| 日韩动漫一区| 亚洲一级高清| 亚洲毛片视频| 精品资源在线| 亚洲午夜久久| 欧美精品一二| 日韩中文在线播放| 日韩.com| 精品女同一区二区三区在线观看| 日本一区二区中文字幕| 国产精选在线| 久久久久亚洲精品中文字幕| 欧美一区激情| 日本久久一区| 美女91精品| 亚洲一区黄色| 亚洲精品中文字幕乱码| 日韩中文在线电影| 国内精品伊人| 久久这里只有| 久久精品人人| 精品黄色一级片| 久久不卡国产精品一区二区| 国产日韩一区二区三免费高清| 日韩欧美激情| 四虎精品永久免费| 免费视频一区二区| 亚洲一区二区小说| 亚洲精品四区| 色狠狠一区二区三区| 亚洲网址在线观看| 亚洲欧美在线专区| 日本中文字幕不卡| 日本欧美在线看| 日韩理论片av| 国产精品国码视频| 青草av.久久免费一区| 中文字幕在线免费观看视频| 国产精品白丝久久av网站| 激情视频一区二区三区| 午夜国产精品视频免费体验区| 青草国产精品久久久久久| 国产精品白浆| 久久99蜜桃| 精品国产黄a∨片高清在线| 亚洲黄色中文字幕| 韩日一区二区| 国产一区 二区| 狠狠久久伊人| 日韩精品三区四区| 免费一区二区视频| 日韩一区电影| 国产日本精品| 欧美国产一级| 国产精品精品| 日韩欧美国产精品综合嫩v| 911亚洲精品| 日本一区二区免费高清| 999精品在线| 亚洲精选久久| 伊人精品一区| 视频精品一区| 久久中文字幕一区二区| 亚洲激情不卡| 日韩在线不卡| 精品免费av在线| 国产精品手机在线播放| 国产精品视频一区二区三区四蜜臂| 日韩欧美午夜| 国产va在线视频| 日韩av影院| 成人国产精选| 日韩精品91亚洲二区在线观看| 欧美日韩在线二区| 国产精品男女| 在线日韩中文| 亚洲精品日本| 欧美精品一卡| 精品中文字幕一区二区三区| 亚洲男人在线| 午夜影院一区| 成人国产精品一区二区网站| 国产乱码精品一区二区三区亚洲人 | 电影亚洲精品噜噜在线观看| 美女视频黄 久久| 欧美aa国产视频| 日韩成人a**站| 91一区二区三区四区| 亚洲一区二区动漫| 国产精品成人自拍| 男女性色大片免费观看一区二区 | 日韩精品一区二区三区av| 欧美一级全黄| 美女网站久久| 国产精品流白浆在线观看| 视频一区二区中文字幕| 免费在线观看日韩欧美| 亚洲激情黄色| 一区二区视频欧美| 欧产日产国产精品视频| 久久精品观看| 欧美亚洲三区| 黄色国产精品| 水蜜桃久久夜色精品一区| 久久九九精品| 麻豆精品视频在线| 日韩欧美另类中文字幕| 国产一级久久| 99久久99久久精品国产片果冰 | 久久久国产亚洲精品| 国产精品午夜av|