У автоматичному боксі це конверсія на основі змінної/посилання, яку ми призначаємо чи навпаки?

public class TestBox {
    Integer i;
    int j;

    public static void main (String[] args) {
        TestBox t = new TestBox();
        t.go();
    }

    public void go() {
        j = i;
        System.out.println(j);
        System.out.println(i);
    }
}  

Я отримую виняток нульового покажчика на рядок j = i .
Хоча, якщо ця лінія буде перетворена як i = j , я отримаю вихід як 0 0 , що є значеннями за замовчуванням int.
Моє питання полягає в тому, що, коли I присвоюється j , не слід i отримати копіювання як int змінну і замість значення за замовчуванням від початкового значення за замовчуванням?

1

6 Відповіді

Компілятор переводить це призначення

j = i;

... в це:

j = i.intValue( );

Якщо i є нульовим, ви отримаєте NPE.

5
додано

З JLS §5.1 .8 :

Під час виконання конверсії конвертування виконується наступним чином:

     
      
  • Якщо r є нульовим, конверсія з відключенням виводить NullPointerException
  •   

Щоб уникнути NPE, вам слід ініціалізувати i ( Integer ), перш ніж спробувати призначити його примітиву

4
додано
Argh - побили мене до JLS, +1
додано Автор arshajii, джерело

Because there is no equivalent of null in primitives. When you try to unbox i which is null to primitive j , it will be a NullPointerException as i is null. Unboxing null always throws NullPointerException. This is as per the JLS

Якщо r є нульовим, конверсія з розблокуванням виводить NullPointerException

0
додано

ініціалізувати я з деякими значеннями, як

Integer i = someValue;

Ваш цілий я не ініціалізований. Якщо ви використовуєте Eclipse, яке покаже помилку

0
додано

Нульове значення визначається як значення за замовчуванням примітивної змінної екземпляра цілого числа, і це є єдиним контекстом, за яким застосовується це за замовчуванням. Було б цілком небезпечно вважати нульовим з нуля повітрям для нульового цілого значення. Зрозуміло, дизайнери Java так і не визначили.

0
додано

Ви ніколи не ініціалізували i , тоді i є null , і на нього неможливо було вимкнути кодування.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників