JAvaベースタイプの梱包解体
JAvaベースタイプの梱包解体
本文を通じてどんな知識を知ることができますか?なぜ基本データ型が箱を分解して空のポインタ異常を報告する可能性があるのですか? 基本データ型の梱包と解体操作はどのように実現されますか?
オートマチックボックス
まず、次のコードがあります.
対応するclassファイルを逆コンパイルし、次のバイトコードを得ます.
ここで、
ではintegerがnullに等しいと
自動梱包
まず、次のコードが必要です.
対応するclassファイルを逆コンパイルし、次のバイトコードを得ます.
ここで、
つまり、
基本データ型はjavaにnull値が存在しないため、自然に対応する自動梱包操作には自動梱包操作の空ポインタ異常リスクはありません.
結論
最後に、基本データ型の自動梱包作業については、実際には
作者について微信(追加はソースを明記してください):qiao 1213812 微信公衆番号:java初心者 GitHubトップページ:https://github.com/JoeKerouac
本文を通じてどんな知識を知ることができますか?
オートマチックボックス
まず、次のコードがあります.
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."":()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."":(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."":()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である場合、自動解体操作を行うと、空のポインタリスクがある.作者について