關于java的空指針java.lang.NullPointerException
1、關于概述
??
java.lang.NullPointerExceptin
我相信只要你是指針做java開發的,那就一定遇到過。關于NullPointerException由RuntimeException派生出來,指針是關于一個運行時異常。其意指可能會在運行的指針時候才會被拋出。一個變量是關于null,即只有其名,指針沒有實值內容,關于也沒分配內存,指針對它進行操作就會出現NullPointException。關于
?? 很多文檔上說出現這個異常的指針原因就是引用為null,導致這個異常,關于比如這樣的指針:Object obj=null; obj.getClass()
。但是關于我想說的是,大部分情況是這樣(即空引用調用方法等),但是有時也不是。下面我們對String,Integer,Boolean
這三個類做運算,看看能否出現空指針異常。
2、String類型
?? 對String類型做各種運算符操作(只要是String支持的),我們發現符合常規情況,即空引用調用方法出現NullPointerException。
@Testpublic void testNullPointerExceptin_String(){ String str = "abc"; String strNull = null; /** * 算術運算符,String只能使用+ */ System.out.println(str+strNull); //abcnull System.out.println(strNull + str); //nullabc /** * 關系運算符,String只能使用 == ,!= */ System.out.println(str == strNull); //false System.out.println(strNull == str); //false System.out.println(str != strNull); //true /** * 位運算符,String 均不能使用 * 邏輯運算符,String 均不能使用 */ /** * 賦值運算符,String只能使用=,+= */ System.out.println(str = strNull); //null str = "abc"; System.out.println(strNull = str); //abc strNull = null; System.out.println(str += strNull); //abcnull str = "abc"; System.out.println(strNull += str); //nullabc strNull = null; /** * 其他 */ System.out.println(str.equals(strNull)); //false System.out.println(strNull.equals(str)); //NullPointerException System.out.println(str instanceof String); //true System.out.println(strNull instanceof String); //false}
3、Integer類型
?? 從下面的代碼可以看出,
Integer
類型除了==、!=、=
這三個運算符外,在執行其他的運算符時,都會有空指針問題。
@Testpublic void testNullPointerExceptin2(){ Integer inte = 12; Integer inteNull = null; /** * 算術運算符 */ System.out.println(inte + inteNull); //NullPointerException System.out.println(inteNull + inte); //NullPointerException System.out.println(inte - inteNull); //NullPointerException System.out.println(inte * inteNull); //NullPointerException System.out.println(inte / inteNull); //NullPointerException System.out.println(inte % inteNull); //NullPointerException System.out.println(inteNull++); //NullPointerException System.out.println(inteNull--); //NullPointerException /** * 關系運算符 */ System.out.println(inte == inteNull); //false System.out.println(inte != inteNull); //true System.out.println(inte > inteNull); //NullPointerException System.out.println(inte < inteNull); //NullPointerException System.out.println(inte >= inteNull); //NullPointerException System.out.println(inte <= inteNull); //NullPointerException /** * 位運算符 */ System.out.println(inte & inteNull); //NullPointerException System.out.println(inte | inteNull); //NullPointerException System.out.println(inte ^ inteNull); //NullPointerException System.out.println(inte << inteNull); //NullPointerException System.out.println(inte >> inteNull); //NullPointerException System.out.println(inte >>> inteNull); //NullPointerException System.out.println(~inteNull); //NullPointerException /** * 邏輯運算符,Integer不能使用 */ /** * 賦值運算符 */ System.out.println(inteNull = inte); //12 inteNull = null; System.out.println(inteNull += inte); //NullPointerException inteNull = null; System.out.println(inteNull -= inte); //NullPointerException inteNull = null; System.out.println(inteNull *= inte); //NullPointerException inteNull = null; System.out.println(inteNull /= inte); //NullPointerException inteNull = null; System.out.println(inteNull %= inte); //NullPointerException inteNull = null; System.out.println(inteNull <<= inte); //NullPointerException inteNull = null; System.out.println(inteNull >>= inte); //NullPointerException inteNull = null; System.out.println(inteNull &= inte); //NullPointerException inteNull = null; System.out.println(inteNull ^= inte); //NullPointerException inteNull = null; System.out.println(inteNull |= inte); //NullPointerException}
4、布爾類型
?? 對于
Boolean
類型,除了賦值運算符=
,其他的都會發生空指針異常。
@Testpublic void testNullPointerExceptin3(){ Boolean flag = true; Boolean flagNull = null; /** * 算術運算符 * 關系運算符 */ /** * 位運算符 */ System.out.println(flagNull & flag); //NullPointerException System.out.println(flagNull | flag); //NullPointerException System.out.println(flagNull ^ flag); //NullPointerException /** * 邏輯運算符 */ System.out.println(flagNull && flag); //NullPointerException System.out.println(flagNull || flag); //NullPointerException System.out.println(!flagNull); //NullPointerException /** * 賦值運算符 */ System.out.println(flagNull = flag); //true flagNull = null; System.out.println(flagNull &= flag); //NullPointerException flagNull = null; System.out.println(flagNull ^= flag); //NullPointerException flagNull = null; System.out.println(flagNull |= flag); //NullPointerException}
5、總結
- 發生空指針異常的原因除了“空引用操作方法”外,還可能是對空對象執行部分運算符;
instanceof
是安全的,不會發生空指針異常;- 部分類型的空對象進行運算符操作
- 除了“空引用操作方法”導致的空指針異常外。對String類型的空對象執行運算符,一般情況下不會發生空指針異常;
- 除了“空引用操作方法”導致的空指針異常外。對數值類型(
Integer,Float,Double,Byte
等)的空對象執行運算符,除了==、!=、=
這三個運算符外,其他運算符都會發生空指針異常;- 除了“空引用操作方法”導致的空指針異常外。對Boollean類型的空對象執行運算符,除了
=
運算符外,其他運算符都會發生空指針異常。
6、如何避免空指針
在全棧的道路上,積極向上、成熟穩重、謙虛好學、懷著熾熱的心向前方的走得更遠。
- 在使用equals方法時,盡量是
已知量.equals(未知量)
這種,這里的“已知量”可是是常量、枚舉等。比如String man="1"; man.equals(people.getSex())";
,而不是String man="1"; people.getSex().equals(man)";
,因為man是常量,而people.getSex()未知,可能為空;- 方法的返回值是null時,盡量創建一個新對象返回,不要直接返回null。比如某個方法的返回值是People,如果發現返回值是null,盡量替換成new People();這樣調用方可以避免空指針判斷;
- 優先使用String.valueOf()方法代替toString()。當程序代碼需要對象的字符串表示形式時,請避免使用該對象的toString方法。如果你的對象的引用等于null,NullPointerException則會拋出,使用靜態String.valueOf方法,該方法不會拋出任何異常并打印"null"。但是,這個“null”有時很坑,后端返給前端的字段,如果是null,盡量返回null,而不是“null”;
- 對數值類型的對象進行運算符操作時,盡量先判空。
作者:Erneste
來源鏈接:https://www.cnblogs.com/DDgougou/p/13921353.html