2015-06-08 4 views
0

Я пытаюсь написать простую программу диеты, используя карты с этим кодом. Но я продолжаю получать NPE, который постоянно прерывает процесс.Получение «java.lang.NullPointerException» при работе с картами

Что не так с моим кодом? Почему я продолжаю получать эту ошибку и как ее исправить?

class Diet { 
    public static void main(String[] args) { 

    Map < Integer, String > FandVMap = new HashMap < Integer, String > (15); 

    FandVMap.put(1, "A bowl of Salad"); 

    /* . 
    . 
    . 
    */ 

    FandVMap.put(12, "A Banana"); 

    //************************************************************ 

    Map < String, Integer > CaloryMap = new HashMap < String, Integer > (30); 

    CaloryMap.put("An Orange", 30); 
    . 
    . 
    . 
    CaloryMap.put("A bowl of Salad", 30); 

    Random randomGenerator = new Random(); 
    randomGenerator = new Random(); 
    int i = 0; 
    //int rand; 
    while (true) { 
     Integer rand = 0; 
     rand = randomGenerator.nextInt(12); 

     String name = FandVMap.get(rand); 
     System.out.println(name); 
     Integer Calory = 0; 
     Calory = CaloryMap.get(name); // This is where the problem occurs. <<======== 
     int Sum=0; 
     Sum=Sum+Calory.intValue(); 
     System.out.println(Sum); 

     if (Sum > 1000) { 
     break; 
     } 
    } 
    } 
} 

А вот выход я получаю:

A Peach 
50 
null 
A bowl of Salad 
30 
A Nectarine 
50 
java.lang.NullPointerException 
at Diet.main(gadas.java:83) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

Calory Сумма не работает либо.

+0

Потому что ваш 'CaloryMap' не есть ценность, которую вы ожидаете. Убедитесь, что все имена из «FandVMap» представлены в «CaloryMap». – cybersoft

+1

Если вы хотите сопоставить небольшое порядковое целое значение с String, использование 'HashMap' является излишним. Для этого есть структура, и это называется «массив». –

+0

Вы никогда не покинете цикл while, потому что ваша сумма всегда будет обнулена – ha9u63ar

ответ

6

Метод randomGenerator.nextInt(int n) - возвращает псевдослучайное равномерно распределенное значение int между 0 (включительно) и n (исключая).

Так что я думаю, что в какой-то момент, когда randomGenerator.nextInt(int n) возвращает 0, то -

String name = FandVMap.get(rand) 

возвращает null и, следовательно, -

Calory = CaloryMap.get(name); 

также evaluted к null

Кроме того, если вы FandVMap карта Безразлично» t содержит ключ из диапазона от 1 до 12, тогда ошибка может возникнуть для нескольких случаев. Suppouse ваша карта FandVMap не содержит ключа 4, тогда FandVMap.get(4) также возвращает null.

+0

Спасибо, я исправил ее. Я не могу поверить. Такая простая проблема смутила меня в течение нескольких часов. и проблема с суммой была еще хуже !. Тпй. – Ghaghaleelee

0

String name = FandVMap.get(rand);

Это очень вероятно, возвращает нуль, который вы не проверяют. Кроме того, ваше имя переменной не соответствует стандартным протоколам, ваши переменные экземпляры должны быть верблюдными, начиная с буквы нижнего регистра. Например, CaloryMap должен стать caloryMap. Это не влияет на это напрямую, но хорошо воспитывать.

0

Whith randomGenerator.nextInt (12), вы получите случайное число от 0 (включительно) до 12 (Exlusive)

так что если вы получаете 0 FandVMap.get (рант) будет нулевым, потому что у вас нет запись whith 0 в качестве ключа в HashMap.

rand = randomGenerator.nextInt (12);

String name = FandVMap.get(rand); 
    System.out.println(name); 
    Integer Calory = 0; 
    Calory = CaloryMap.get(name); 

из JavaDoc:public int nextInt(int n) Возвращает псевдохаотическом равномерно распределенное значение INT между 0 (включительно) и заданным значением (эксклюзив) *

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