Java中關於Null的9個說明(Java Null詳解)。本站提示廣大學習愛好者:(Java中關於Null的9個說明(Java Null詳解))文章只能為提供參考,不一定能成為您想要的結果。以下是Java中關於Null的9個說明(Java Null詳解)正文
關於Java法式員來講,null是使人頭痛的器械。經常會遭到空指針異常(NPE)的騷擾。連Java的創造者都認可這是他的一項偉大掉誤。Java為何要保存null呢?null湧現有一段時光了,而且我以為Java創造者曉得null與它處理的成績比擬帶來了更多的費事,然則null依然陪同著Java。
我更加覺得驚異,由於java的設計道理是為了簡化工作,那就是為何沒有糟蹋時光在指針、操作符重載、多繼續完成的緣由,null卻與此正好相反。好吧,我真的不曉得這個成績的謎底,我曉得的是不論null被Java開辟者和開源社區若何批駁,我們必需與null配合存在。與其為null的存在覺得懊悔,我們倒不如更好的進修null,確保准確應用null。
為何在Java中須要進修null?由於假如你對null不留意,Java將使你遭遇空指針異常的苦楚,而且你也會獲得一個沉痛的經驗。精神充分的編程是一門藝術,你的團隊、客戶和用戶將會加倍觀賞你。以我的經歷來看,招致空指針異常的一個最重要的緣由是對Java中null的常識還不敷。你們傍邊的許多曾經對null很熟習了,然則對那些不是很熟習的來講,可以學到一些關於null老的和新的常識。讓我們一路從新進修Java中null的一些主要常識吧。
Java中的Null是甚麼?
正如我說過的那樣,null是Java中一個很主要的概念。null設計初志是為了表現一些缺掉的器械,例如缺掉的用戶、資本或其他器械。然則,一年後,使人頭疼的空指針異常給Java法式員帶來很多的騷擾。在這份資料中,我們將進修到Java中null症結字的根本細節,而且摸索一些技巧來盡量的削減null的檢討和若何防止惡心的空指針異常。
1)起首,null是Java中的症結字,像public、static、final。它是年夜小寫敏感的,你不克不及將null寫成Null或NULL,編譯器將不克不及辨認它們然後報錯。
Object obj = NULL; // Not Ok
Object obj1 = null //Ok
應用其他說話的法式員能夠會有這個成績,然則如今IDE的應用曾經使得這個成績變得眇乎小哉。如今,當你敲代碼的時刻,IDE像Eclipse、Netbeans可以改正這個毛病。然則應用其他對象像notepad、Vim、Emacs,這個成績卻會糟蹋你名貴時光的。
2)就像每種原始類型都有默許值一樣,如int默許值為0,boolean的默許值為false,null是任何援用類型的默許值,不嚴厲的說是一切object類型的默許值。就像你創立了一個布爾類型的變量,它將false作為本身的默許值,Java中的任何援用變量都將null作為默許值。這對一切變量都是實用的,如成員變量、部分變量、實例變量、靜態變量(但當你應用一個沒有初始化的部分變量,編譯器會正告你)。為了證實這個現實,你可以經由過程創立一個變量然後打印它的值來不雅察這個援用變量,以下圖代碼所示:
private static Object myObj;
public static void main(String args[]){
System.out.println("What is value of myObjc : " + myObj);
}
What is value of myObjc : null
這對靜態和非靜態的object來講都是准確的。就像你在這裡看到的如許,我將myObj界說為靜態援用,所以我可以在主辦法裡直接應用它。留意主辦法是靜態辦法,弗成應用非靜態變量。
3)我們要廓清一些誤會,null既不是對象也不是一品種型,它僅是一種特別的值,你可以將其付與任何援用類型,你也能夠將null轉化成任何類型,來看上面的代碼:
String str = null; // null can be assigned to String
Integer itr = null; // you can assign null to Integer also
Double dbl = null; // null can also be assigned to Double
String myStr = (String) null; // null can be type cast to String
Integer myItr = (Integer) null; // it can also be type casted to Integer
Double myDbl = (Double) null; // yes it's possible, no error
你可以看到在編譯和運轉時代,將null強迫轉換成任何援用類型都是可行的,在運轉時代都不會拋出空指針異常。
4)null可以賦值給援用變量,你不克不及將null賦給根本類型變量,例如int、double、float、boolean。假如你那樣做了,編譯器將會報錯,以下所示:
int i = null; // type mismatch : cannot convert from null to int
short s = null; // type mismatch : cannot convert from null to short
byte b = null: // type mismatch : cannot convert from null to byte
double d = null; //type mismatch : cannot convert from null to double
Integer itr = null; // this is ok
int j = itr; // this is also ok, but NullPointerException at runtime
正如你看到的那樣,當你直接將null賦值給根本類型,會湧現編譯毛病。然則假如將null賦值給包裝類object,然後將object賦給各自的根本類型,編譯器不會報,然則你將會在運轉時代碰到空指針異常。這是Java中的主動拆箱招致的,我們將鄙人一個要點看到它。
5) 任何含有null值的包裝類在Java拆箱生成根本數據類型時刻都邑拋出一個空指針異常。一些法式員犯如許的毛病,他們以為主動裝箱會將null轉換成各自根本類型的默許值,例如關於int轉換成0,布爾類型轉換成false,然則那是不准確的,以下面所示:
Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error
然則當你運轉下面的代碼片斷的時刻,你會在掌握台上看到主線程拋出空指針異常。在應用HashMap和Integer鍵值的時刻會產生許多如許的毛病。當你運轉上面代碼的時刻就會湧現毛病。
import java.util.HashMap;
import java.util.Map;
/**
* An example of Autoboxing and NullPointerExcpetion
*
* @author WINDOWS 8
*/
public class Test {
public static void main(String args[]) throws InterruptedException {
Map numberAndCount = new HashMap<>();
int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
for(int i : numbers){
int count = numberAndCount.get(i);
numberAndCount.put(i, count++); // NullPointerException here
}
}
}
輸入:
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:25)
這段代碼看起來異常簡略而且沒有毛病。你所做的一切是找到一個數字在數組中湧現了若干次,這是Java數組中典范的尋覓反復的技巧。開辟者起首獲得之前的數值,然後再加一,最初把值放回Map裡。法式員能夠會認為,挪用put辦法時,主動裝箱會本身處置好將int裝箱成Interger,然則他忘卻了當一個數字沒有計數值的時刻,HashMap的get()辦法將會前往null,而不是0,由於Integer的默許值是null而不是0。當把null值傳遞給一個int型變量的時刻主動裝箱將會前往空指針異常。假想一下,假如這段代碼在一個if嵌套裡,沒有在QA情況下運轉,然則你一旦放在臨盆情況裡,BOOM:-)
6)假如應用了帶有null值的援用類型變量,instanceof操作將會前往false:
Integer iAmNull = null;
if(iAmNull instanceof Integer){
System.out.println("iAmNull is instance of Integer");
}else{
System.out.println("iAmNull is NOT an instance of Integer");
}
輸入:
i
AmNull is NOT an instance of Integer
這是instanceof操作一個很主要的特征,使得對類型強迫轉換檢討很有效
7)你能夠曉得不克不及挪用非靜態辦法來應用一個值為null的援用類型變量。它將會拋出空指針異常,然則你能夠不曉得,你可使用靜態辦法來應用一個值為null的援用類型變量。由於靜態辦法應用靜態綁定,不會拋出空指針異常。上面是一個例子:
public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}
private static void iAmStaticMethod(){
System.out.println("I am static method, can be called by null reference");
}
private void iAmNonStaticMethod(){
System.out.println("I am NON static method, don't date to call me by null");
}
輸入:
I am static method, can be called by null reference
Exception in thread "main" java.lang.NullPointerException
at Testing.main(Testing.java:11)
8)你可以將null傳遞給辦法應用,這時候辦法可以吸收任何援用類型,例如public void print(Object obj)可以如許挪用print(null)。從編譯角度來看這是可以的,但成果完整取決於辦法。Null平安的辦法,如在這個例子中的print辦法,不會拋出空指針異常,只是優雅的加入。假如營業邏輯許可的話,推舉應用null平安的辦法。
9)你可使用==或許!=操作來比擬null值,然則不克不及應用其他算法或許邏輯操作,例如小於或許年夜於。跟SQL紛歧樣,在Java中null==null將前往true,以下所示:
public class Test {
public static void main(String args[]) throws InterruptedException {
String abc = null;
String cde = null;
if(abc == cde){
System.out.println("null == null is true in Java");
}
if(null != null){
System.out.println("null != null is false in Java");
}
// classical null check
if(abc == null){
// do something
}
// not ok, compile time error
if(abc > null){
}
}
}
輸入:
null == null is true in Java
這是關於Java中null的全體。經由過程Java編程的一些經歷和應用簡略的技能來防止空指針異常,你可使你的代碼變得null平安。由於null常常作為空或許未初始化的值,它是迷惑的泉源。關於辦法而言,記載下null作為參數時辦法有甚麼樣的行動也長短常主要的。總而言之,記住,null是任何一個援用類型變量的默許值,在java中你不克不及應用null援用來挪用任何的instance辦法或許instance變量。