加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Java中基础类 型的包装类在拆箱和装箱过程中起到了什么用处

发布时间:2022-12-09 11:25:32 所属栏目:编程 来源:
导读:  下面通过一个简单的示例才重现一下异常出现的场景。

  public class BoxTest {

  

   public static void main(String[] args) {

   Map<String,Object> result = httpRequ

  下面通过一个简单的示例才重现一下异常出现的场景。
 
  public class BoxTest {
 
  
 
      public static void main(String[] args) {
 
          Map<String,Object> result = httpRequest();
 
          long userId = (Long) result.get("userId");
 
      }
 
  
 
      // 模拟一个HTTP请求
 
      private static Map<String,Object> httpRequest(){
 
          Map<String,Object> map = new HashMap<>();
 
          map.put("userId",null);
 
          return map;
 
      }
 
  }
 
  基本的场景就是请求一个接口,去接口中取某个值,这个值为Long类型,从Map中取得值之后,进行Long类型的强转。当接口返回的userId为null时,强转这块就抛出空指针异常:
 
  Exception in thread "main" java.lang.NullPointerException
 
   at com.choupangxia.box.BoxTest.main(BoxTest.java:15)
 
  上面的场景跟下面的代码出现异常效果一样:
 
  public class BoxTest {
 
  
 
      public static long getValue(long value) {
 
          return value;
 
      }
 
  
 
      public static void main(String[] args) {
 
          Long value = null;
 
          getValue(value);
 
      }
 
  }
 
  上述代码也是将Long类型进拆箱导致的异常,只不过一个在代码中,一个在参数中。为了分析更简化,我们以第二个为例进行讲解。
 
  原因分析
 
  最初大家可能会疑惑,抛出异常的代码都没有对象的方法调用,怎么会出现空指针呢?
 
  这中间主要涉及到的就是一个自动拆箱操作。是否是拆箱导致的呢?我们来通过字节码看一下。
 
  通过javap -c来查看一下对应的字节码:
 
  public class com.choupangxia.box.BoxTest {
 
    public com.choupangxia.box.BoxTest();
 
      Code:
 
         0: aload_0
 
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
 
         4: return
 
  
 
    public static long getValue(long);
 
      Code:
 
         0: lload_0
 
         1: lreturn
 
  
 
    public static void main(java.lang.String[]);
 
      Code:
 
         0: aconst_null
 
         1: astore_1
 
         2: aload_1
 
         3: invokevirtual #2                  // Method java/lang/Long.longValue:()J
 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!