View Full Version : [Java]Problema con HashMap.Prima esiste la chiave,poi da una NullPointerException!
doctorAle85
30-10-2009, 00:35
Scusate, sto impazzendo con un HashMap;
Mi sono creato l'hashMap e ho provato a stamparlo per vedere se era corretto!...e sembrava corretto!!!
Poi sono andato a farfe una get e mi dice che la chiave (k) non esiste lanciandomi una NullPointerException!!!
Allo stesso tempo se vado a invocare il metodo keySet(), tra le chiavi ci trovo K che invece sembra non esistere invocando la contains(K).
Com'è possibile?
grazie mille
wingman87
30-10-2009, 00:54
Non è che nel stampare gli oggetti contenuti li hai anche rimossi dall'HashMap? Comunque posta il codice e potremo darti risposte più precise.
doctorAle85
30-10-2009, 01:27
Non è che nel stampare gli oggetti contenuti li hai anche rimossi dall'HashMap? Comunque posta il codice e potremo darti risposte più precise.
Map<key,value> hm=creationHashMap();
key k=...
System.out.println(hm.containsKey(k)); //restituisce false
Iterator<key> it=setKey.iterator();
while(it.hasNext()){
key1=it.next();
System.out.println(hm.get(key1)); //quando scandisce setKey e arriva alla chiava k restituisce true
}
ps Anche se non faccio la stampa, ma faccio direttamente value v=hm.get(k) restituisce null.
ps1 Dato che sull'hashMap ci devo richiamare un altro metodo dopo, alcune chiavi le riconosce e restituisce il valore associato...altre come k invece no!:muro:
banryu79
30-10-2009, 08:12
Dovresti postarci il codice completo, se vuoi che ti aiutiamo a trovare il problema, ovvero anche il codice del metodo creationHashMap() e il codice che crea la prima chiave k, in quello postato sopra hai messo i puntini di sospensione...
Comunque questa è la documentazione javadoc del metodo get della classe HashMap:
public V get(Object key)
Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)
A return value of null does not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key to null. The containsKey operation may be used to distinguish these two cases.
^TiGeRShArK^
30-10-2009, 08:41
la cosa + probabile mi pare che il value associato alla key k sia null....
banryu79
30-10-2009, 08:56
la cosa + probabile mi pare che il value associato alla key k sia null....
Infatti, e come si legge dalla documentazione può verifacarlo facilmente invocando il metodo containsKey() passando come argomento la key che passata a get() produceva null come valore restituito.
doctorAle85
30-10-2009, 09:18
la cosa + probabile mi pare che il value associato alla key k sia null....
Io penso che invece il null sia riferito al fatto che non ci sia la chiave:
1) perchè la contains(key) mi restituisce false
2) perchè anche se il valore associato alla chiave fosse null non dovrebbe restituire una NullPointerException (almeno credo!!!)
Ps...la cosa si verifica anche con Hashtable
Io ho paura che c'è qualche problema di hash della chiave...nn potrebbe essere?
Se non va, faccio una porcata e mi creo una lista di vettori di Object con size=2...e quando devo fare la ricerca della chiave mi faccio la scansione della lista!
banryu79
30-10-2009, 10:39
Io penso che invece il null sia riferito al fatto che non ci sia la chiave:
1) perchè la contains(key) mi restituisce false
2) perchè anche se il valore associato alla chiave fosse null non dovrebbe restituire una NullPointerException (almeno credo!!!)
Ps...la cosa si verifica anche con Hashtable
Io ho paura che c'è qualche problema di hash della chiave...nn potrebbe essere?
Ah, alcune domande: come chiave cosa usi? Oggetti di una classe da te definita? Se sì, se nella tua classe hai eseguito l'ovveride del metodo equals() devi ridefinire anche hashCode(), e implementare entrambi rispettando il contratto definito per quei metodi.
doctorAle85
30-10-2009, 13:28
Ho trovato l'errore...
si tratta si una lettera maiuscola nel toString dell'oggetto che considero come chiave!!!
Praticamente a volte (nn so perchè), il toString mi mette la lettera maiuscola all'inizio, altre volte invece la minuscola...
...e il problema c'è quando con la lettera maiuscola, dato che quando è stato inserito nell'hashMap aveva la lettera minuscola!
Dovrò farlo risolvere a chi ha fatto il software che mi è stato fornito... ;)
ps equals e hashCode sono ridefiniti correttamente...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.