加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2021-05-22 21:18:42 所属栏目:语言 来源:互联网
导读:问题重现 下面通过一个简单的示例才重现一下异常出现的场景。 public classBoxTest{ public static voidmain(String[]args){ MapString,Objectresult=httpReques
副标题[/!--empirenews.page--]

下面通过一个简单的示例才重现一下异常出现的场景。

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 

(编辑:辽源站长网)

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

推荐文章
    热点阅读