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."":()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である場合、自動解体操作を行うと、空のポインタリスクがある.
    作者について
  • 微信(追加はソースを明記してください):qiao 1213812
  • 微信公衆番号:java初心者
  • GitHubトップページ:https://github.com/JoeKerouac