您好,登錄后才能下訂單哦!
這篇文章主要介紹“java中的裝箱拆箱是什么意思”,在日常操作中,相信很多人在java中的裝箱拆箱是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java中的裝箱拆箱是什么意思”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
通過本文能了解哪些知識?
為什么基本數據類型拆箱有可能會報空指針異常?
基本數據類型的裝箱與拆箱操作是如何實現的?
首先我們有如下代碼:
public class Test{
static {
Integer integer = new Integer(1234);
int i = integer;
}
}
反編譯其對應的class文件,得到如下字節碼:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
static {};
Code:
0: new #2 // class java/lang/Integer
3: dup
4: sipush 1234
7: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
10: astore_0
11: aload_0
12: invokevirtual #4 // Method java/lang/Integer.intValue:()I
15: istore_1
16: return
LineNumberTable:
line 3: 0
line 4: 11
line 5: 16
}
其中int i = integer
對應的字節碼如下:
11: aload_0
12: invokevirtual #4 // Method java/lang/Integer.intValue:()I
15: istore_1
可以看出,對于int i = integer
,實際上等價于以下語句:
int i = integer.intValue();
那么當integer等于null的時候就變為了((Integer)null).intValue()
了,自然就會拋出空指針異常了;對于其他基本數據類型也是同樣的原理
首先需要如下代碼:
public class Test{
static {
int i = 1234;
Integer integer = i;
}
}
反編譯其對應的class文件,得到如下字節碼:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
static {};
Code:
0: sipush 1234
3: istore_0
4: iload_0
5: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: astore_1
9: return
LineNumberTable:
line 3: 0
line 4: 4
line 5: 9
}
其中Integer integer = i
對應的字節碼如下:
4: iload_0
5: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: astore_1
也就是對于Integer integer = i
語句,實際上等價于:
Integer integer = Integer.valueOf(i);
而因為基本數據類型在java中不存在null值,自然對應的自動裝箱操作也就沒有自動裝箱操作的空指針異常風險了。
最后,我們得到如下結論,對于基本數據類型的自動裝箱操作,實際上是使用了Integer.valueOf(int)
方法,而對于基本數據類型對應的包裝類型的自動拆箱操作,則是使用了Integer#intValue()
方法(注意,此方法是普通方法而不是靜態方法),所以當對應的Integer
對象為null時對其進行自動拆箱操作就會有空指針風險;
到此,關于“java中的裝箱拆箱是什么意思”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。