2013-11-27 2 views
0

Кода: -Хочет знать внутренний код, выведенный компилятором, а распаковка

Integer value =null; 
int a = value; 

Выход: -

Exception in thread "main" java.lang.NullPointerException 

Я понимаю, что распаковка не удалась, потому что не INT значения для нулевой ссылки. Но может ли кто-нибудь сказать мне метод, вызываемый, который приводит к nullPointerException

+9

Поскольку среда выполнения пыталась вызвать 'value.intValue()' внутренне, чтобы получить результат, но 'value' является' null'. –

+1

@LuiggiMendoza Вы должны разместить это как ответ. –

+1

@ZouZou вы можете использовать мой комментарий как свой ответ. –

ответ

4

При присвоении ссылочного типа Integer соответствующему примитивному типу int происходит преобразование распаковки. Она определяется в jls-5.1.8 Unboxing Conversion:

Если г является ссылкой типа Integer, то распаковка преобразования преобразует г в r.intValue()

Таким образом, когда вы пытаетесь распаковка его, value.intValue() получил название NPE, так как value is null

+0

+1 для справки JLS – iamnotmaynard

2

Прежде всего вам нужно понять, что код, который у вас есть, на самом деле скомпилирован в нечто иное.

[[email protected] bin]$ /usr/java/latest/bin/javap -c Test.class 
Compiled from "Test.java" 
public class Test { 
    ... 

    public static void main(java.lang.String[]) throws java.io.IOException; 
    Code: 
     0: aconst_null 
     1: astore_1  
     2: aload_1  
     3: invokevirtual #19     // Method java/lang/Integer.intValue:()I 
     6: istore_2  
     7: return   
} 

Вы заметите, что есть призывание java/lang/Integer.intValue(). Поскольку ваша переменная Integer ссылается на null, вы получите NullPointerException, когда вызов пытается разыменовать ее.

Смежные вопросы