почему этот код генерирует исключение NullPointerException? - PullRequest
6 голосов
/ 02 июля 2010

В конце концов я получил ответ, но он на некоторое время озадачил меня.

Почему следующий код выдает исключение NullPointerException при запуске?

import java.util.*;

class WhyNullPointerException {
    public static void main( String [] args ){
       // Create a map
        Map<String,Integer> m = new HashMap<String,Integer>();
        // Get the previous value, obviously null.
        Integer a = m.get( "oscar" );
        // If a is null put 1, else increase a
        int p = a == null ? 
            m.put( "oscar", 1) : 
            m.put( "oscar", a++ ); // Stacktrace reports Npe in this line
    }
}

Ответы [ 2 ]

11 голосов
/ 02 июля 2010

Поскольку m.put возвращает null (что указывает на отсутствие «предыдущего» значения), пока вы пытаетесь присвоить его int. Замените int p на Integer p, и оно будет работать.

Это указано в JLS 5.1.8 :

5.1.8 Распаковка конверсии

Во время выполнения распаковка конвертации происходит следующим образом:

  • Если r равно null, преобразование при распаковке выдает NullPointerException

Не имеет отношения к проблеме, просто побочное предложение с DRY , подумайте о его написании так:

    Integer p = m.put("oscar", a == null ? 1 : a++);

Это немного более читабельно:)

5 голосов
/ 02 июля 2010

Вы присваиваете int p возвращаемому значению m.put(). Но put() возвращает null в этой ситуации, и вы не можете присвоить int null.

Из Javadocs для HashMap.put():

Возвращает: предыдущее значение, связанное с указанным ключом, или ноль, если не было отображение для ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...