2015-08-03 2 views
4

Follwing моего Java класса TestEntry.javaTreeMap прибудет бросает NullPointerException

private void initializemapTest() 
    { 
     eventMap = new TreeMap<String,String>(); 

     //Put some value into eventMap 

     mapTest = new TreeMap<String, String>(new Comparator<String>() 
     { 
      public int compare(String key1, String key2) 
      { 
       if(key1 == null) 
       { 
        if(key2 == null) 
        { 
         return 0; 
        } 
        else 
        { 
         return 1; 
        } 
       } 
       else 
       { 
        if(key2 == null) 
        { 
         return -1; 
        } 
        else 
        { 
         return key1.compareTo(key2); 
        } 
       } 
      } 
     }); 

     for(String s : eventMap.keySet()) 
     { 
      mapTest.put(eventMap.get(s), s); //Error at this line 
     } 

    } 

По моим сведениям eventMap оленьей кожи позволяет нулевые значения, следовательно, набор ключей из eventMap не имеет нулевые значений, если значение любого ключа в eventMap равно нулю, в то время как я пытаюсь поставить его в mapTest, не shoukd бросать любые исключения нулевого указателя, поскольку его соответствующий компаратор позволяет нулевые значения

Но почему я получаю это исключение

 java.lang.NullPointerException 
     at java.util.TreeMap.cmp(TreeMap.java:1911) 
     at java.util.TreeMap.get(TreeMap.java:1835) 
     at kidiho.sa.client.reports.ReportEntry.initializemapTest(TestEntry.java:22) 
+0

Ваш опубликованный код несколько запутан. Где карта инициализирована? Где вы называете 'initializeEntry()'? – Thomas

+0

вы можете показать нам результат '\t \t System.out.println (eventPropertyMap.keySet()); 'выше для цикла. –

+2

Какую версию Java вы используете? Я не нахожу 'cmp (...)' метод в TreeMap в трех разных версиях. – Thomas

ответ

6

Он выкинет NullPointerException, потому что в методе TreeMap api get() бросает NullPointerException намеренно, если это null.

final Entry<K,V> getEntry(Object key) { 
     // Offload comparator-based version for sake of performance 
     if (comparator != null) 
      return getEntryUsingComparator(key); 
     if (key == null) 
      throw new NullPointerException(); 
     Comparable<? super K> k = (Comparable<? super K>) key; 
     Entry<K,V> p = root; 
     while (p != null) { 
      int cmp = k.compareTo(p.key); 
      if (cmp < 0) 
       p = p.left; 
      else if (cmp > 0) 
       p = p.right; 
      else 
       return p; 
     } 
     return null; 
    } 
1

От TreeMap:

final Entry<K,V> getEntry(Object key) { 
    // Offload comparator-based version for sake of performance 
    if (comparator != null) 
     return getEntryUsingComparator(key); 
    if (key == null) 
     throw new NullPointerException(); 
    Comparable<? super K> k = (Comparable<? super K>) key; 
    Entry<K,V> p = root; 
    while (p != null) { 
     int cmp = k.compareTo(p.key); 
     if (cmp < 0) 
      p = p.left; 
     else if (cmp > 0) 
      p = p.right; 
     else 
      return p; 
    } 
    return null; 
} 

То есть: TreeMap не допускает пустых ключей, так что вы не можете сделать:

tm.put(null, something) 

И впоследствии, вы не можете сделать

tm.get(null) 

Как в соответствии с инструкцией TreeMap aviour, эти операции на самом деле не имеют смысла

1

Как и другие, вы не можете использовать значение null в качестве ключа TreeMap, оно выдает NullPointerException.

Вы не получаете NullPointerException с того же места, вероятно, потому, что ваша первая карта имеет зарегистрированный компаратор, а второй - нет.

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