2013-06-05 3 views
0

У меня есть код, который работает, если я использую HashMap, но нет, если вместо этого я использую TreeMap, Может кто-нибудь сказать, почему?HashMap Vs Treemap

Это мой код:

package ka.fil; 

import java.util.HashMap; 
import java.util.Map; 

public class ModelInMemory implements Model { 
    private Map<String,BeanRecord> map = new HashMap<>(); 

    @Override 
    public void putRecord(BeanRecord beanRecord) { 
     map.put(beanRecord.getEmail(), beanRecord); 

    } 

    @Override 
    public BeanRecord getRecord(String email) { 
     BeanRecord r = map.get(email); 
     return r; 
    } 

    @Override 
    public Iterable<BeanRecord> allRecord() { 
     return map.values(); 
    } 

    public ModelInMemory() { 

    } 



} 

Что я имею в виду не работает в том, что, когда я использую его в качестве основного метода я получаю это:

Exception in thread "main" java.lang.NullPointerException at 
java.util.TreeMap.compare(Unknown Source) at java.util.TreeMap.put(Unknown Source) 
at ka.fil.ModelInMemory.putRecord(ModelInMemory.java:11) 
at ka.fil.AppBatch.main(AppBatch.java:10) 
+8

Не могли бы вы определить, не работает? –

+1

Можете ли вы опубликовать сообщение об ошибке? –

+0

Сортировка лексикографически, то есть. – Fildor

ответ

10

Одно из отличий заключается в том, что TreeMaps не поддерживает нулевые ключи, но HashMaps делает.

С TreeMap вы получите исключение во время выполнения, если beanRecord.getEmail() возвращено null.

+0

Я думаю, что это настоящая причина, спасибо – NumberTen

+0

@ Kafil10 Итак, поставьте if (r == null) system.out.println («это ответ») ; сразу после getEmail(). Если это срабатывает, тогда вы узнаете. –

+0

Вы так правы, я не знал, что TreeMap не поддерживает нулевые ключи, так как я довольно новичок в java. Спасибо – NumberTen

3

Если вы просто заменить строку -

private Map<String,BeanRecord> map = new HashMap<>(); 

с -

private Map<String,BeanRecord> map = new TreeMap<>(); 

Тогда это не будет работать, потому что у вас есть

import java.util.HashMap; 

который не включает Древовидные карты. Легкое исправление для этого было бы просто сделать

import java.util.*; 
+1

+1, орел-глаз! Но подстановочный импорт немного «слишком много» imho – fge

+0

Для java.util я обычно ставил подстановочный знак, просто потому, что он настолько полезен, и я, как правило, его много использую. В противном случае я помещу только дикую карту, если я импортирую 3 или более из пакета. –

+0

+1 Но мы не уверены, что его проблема заключается в том, что у пользователя нет сообщения об ошибке. – eternay

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