Java中關(guān)于 null 的幾種處理方式詳解
對(duì)于 Java 程序員來(lái)說(shuō),空指針⼀直是惱⼈的問(wèn)題,我們?cè)陂_(kāi)發(fā)中經(jīng)常會(huì)受到 NullPointerException 的異常。Java 的發(fā)明者也承認(rèn)這是⼀個(gè)巨⼤的設(shè)計(jì)錯(cuò)誤。那么關(guān)于 null ,你應(yīng)該知道下⾯這⼏件事情來(lái)有效的了解 null ,從⽽避免很多由 null 引起的錯(cuò)誤。
⼤⼩寫(xiě)敏感
⾸先,null 是 Java 中的 關(guān)鍵字 ,像是 public、static、final。它是⼤⼩寫(xiě)敏感的,你不能將 null 寫(xiě) 成 Null 或 NULL,編輯器將不能識(shí)別它們?nèi)缓髨?bào)錯(cuò)。
這個(gè)問(wèn)題已經(jīng)⼏乎不會(huì)出現(xiàn),因?yàn)?eclipse 和 Idea 編譯器已經(jīng)給出了編譯器提示,所以你不⽤考慮這
個(gè)問(wèn)題。
null 是任何引⽤類(lèi)型的初始值
null 是所有引⽤類(lèi)型的默認(rèn)值,Java 中的任何引⽤變量都將null作為默認(rèn)值,也就是說(shuō)所有 Object 類(lèi)下的引⽤類(lèi)型默認(rèn)值都是 null。這對(duì)所有的引⽤變量都適⽤。就像是基本類(lèi)型的默認(rèn)值⼀樣,例如 int的默認(rèn)值是 0,boolean 的默認(rèn)值是 false。
下⾯是基本數(shù)據(jù)類(lèi)型的初始值
類(lèi)型 | 初始值 |
---|---|
booleab | false |
char | /u0000 |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
null 只是⼀種特殊的值
null 既不是對(duì)象也不是⼀種類(lèi)型,它僅是⼀種特殊的值,你可以將它賦予任何類(lèi)型,你可以將 null 轉(zhuǎn)換為任何類(lèi)型
public static void main(String[] args) { String str = null; Integer itr = null; Double dou = null; Integer integer = (Integer) null; String string = (String)null; System.out.println("integer = " + integer); System.out.println("string = " + string); }
你可以看到在編譯期和運(yùn)⾏期內(nèi),將 null 轉(zhuǎn)換成任何的引⽤類(lèi)型都是可⾏的,并且不會(huì)拋出空指針異常。
null 只能賦值給引⽤變量,不能賦值給基本類(lèi)型變量。
持有 null 的包裝類(lèi)在進(jìn)⾏⾃動(dòng)拆箱的時(shí)候,不能完成轉(zhuǎn)換,會(huì)拋出空指針異常,并且 null 也不能和基本數(shù)據(jù)類(lèi)型進(jìn)⾏對(duì)⽐
public static void main(String[] args) { int i = 0; Integer itr = null; System.out.println(itr == i); }
使⽤了帶有 null 值的引⽤類(lèi)型變量, instanceof instanceof 操作會(huì)返回
public static void main(String[] args) { Integer isNull = null; // instanceof = isInstance ⽅法 if(isNull instanceof Integer){ System.out.println("isNull is instanceof Integer"); }else{ System.out.println("isNull is not instanceof Integer"); } }
這是 instanceof 操作符⼀個(gè)很重要的特性,使得對(duì)類(lèi)型強(qiáng)制轉(zhuǎn)換檢查很有⽤靜態(tài)變量為 null 調(diào)⽤靜態(tài)⽅法不會(huì)拋出 NullPointerException。因?yàn)殪o態(tài)⽅法使⽤了靜態(tài)綁定。
使⽤ Null-Safe ⽅法
你應(yīng)該使⽤ null-safe 安全的⽅法,java 類(lèi)庫(kù)中有很多⼯具類(lèi)都提供了靜態(tài)⽅法,例如基本數(shù)據(jù)類(lèi)型的包裝類(lèi),Integer , Double 等。例如
public class NullSafeMethod { private static String number; public static void main(String[] args) { String s = String.valueOf(number); String string = number.toString(); System.out.println("s = " + s); System.out.println("string = " + string); } }
number 沒(méi)有賦值,所以默認(rèn)為null,使⽤ String.valueOf(number) 靜態(tài)⽅法沒(méi)有拋出空指針異常,但是使⽤ toString() 卻拋出了空指針異常。所以盡量使⽤對(duì)象的靜態(tài)⽅法。
null 判斷
你可以使⽤ == 或者 != 操作來(lái)⽐較 null 值,但是不能使⽤其他算法或者邏輯操作,例如⼩于或者⼤于。跟SQL不⼀樣,在Java中 null == null 將返回 true,如下所示:
public class CompareNull { private static String str1; private static String str2; public static void main(String[] args) { System.out.println("str1 == str2 ? " + str1 == str2); System.out.println(null == null); } }
到此這篇關(guān)于Java中關(guān)于 null 的⼏種處理⽅式的文章就介紹到這了,更多相關(guān)Java null處理⽅式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目打包成jar包的圖文教程
有時(shí)候我們會(huì)用IDEA來(lái)開(kāi)發(fā)一些小工具,需要打成可運(yùn)行的JAR包,這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目打包成jar包的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12spring-data-redis 動(dòng)態(tài)切換數(shù)據(jù)源的方法
最近遇到了一個(gè)麻煩的需求,我們需要一個(gè)微服務(wù)應(yīng)用同時(shí)訪問(wèn)兩個(gè)不同的 Redis 集群,一般情況下我們會(huì)怎么處理呢,下面通過(guò)場(chǎng)景分析給大家介紹spring-data-redis 動(dòng)態(tài)切換數(shù)據(jù)源的方法,感興趣的朋友一起看看吧2021-08-08SpringBoot注冊(cè)Servlet的三種方法詳解
這篇文章主要介紹了SpringBoot注冊(cè)Servlet的三種方法詳解,教你如何Spring Boot 注冊(cè) Servlet、Filter、Listener,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05前端發(fā)送的請(qǐng)求Spring如何返回一個(gè)文件詳解
這篇文章主要給大家介紹了關(guān)于前端發(fā)送的請(qǐng)求Spring如何返回一個(gè)文件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-09-09