Java中基础类型的包装类在拆箱和装箱过程中起到了什么用处
副标题[/!--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 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |