2010-12-18 13 views
0

Ich habe einen Task-Manager geschrieben, und nun, es ist eine lange Geschichte ... ganz in Java übrigens. Also schrieb ich eine Fassade, die Sie unten sehen können, gibt es ein Problem mit der HashMap und ich vermute, dass die Werte, die ich während der Konstruktion in die HashMap einzufügen versuche, nicht so gut laufen Die Methode, die die Nullzeigerausnahme auslöst, ist die create-Methode, deren Eingabeparameter verifiziert wurden von mir und meinem trusty Debugger zu bevölkernNull Zeiger in meiner Fassade :(

irgendeine Hilfe hier würde groß sein ... Ich bin sicher, dass ich vergessen habe, etwas zu erwähnen, also werde ich auf Anmerkungen so bald wie möglich antworten, wie ich dieses Ding jetzt erledigen muss.

package persistence; 

import java.util.UUID; 
import java.util.HashMap; 

import persistence.framework.ComplexTaskRDBMapper; 
import persistence.framework.IMapper; 
import persistence.framework.RepeatingTaskRDBMapper; 
import persistence.framework.SingleTaskRDBMapper; 

public class PersistanceFacade { 

    @SuppressWarnings("unchecked") 
    private static Class SingleTask; 
    @SuppressWarnings("unchecked") 
    private static Class RepeatingTask; 
    @SuppressWarnings("unchecked") 
    private static Class ComplexTask; 

    private static PersistanceFacade uniqueInstance = null; 
    @SuppressWarnings("unchecked") 
    private HashMap<Class, IMapper> mappers; 

    public PersistanceFacade() { 
     mappers = new HashMap<Class, IMapper>(); 
     try { 
      SingleTask = Class.forName("SingleTask"); 
      RepeatingTask = Class.forName("RepeatingTask"); 
      ComplexTask = Class.forName("ComplexTask"); 
      mappers.put(SingleTask, new SingleTaskRDBMapper()); 
      mappers.put(RepeatingTask, new RepeatingTaskRDBMapper()); 
      mappers.put(ComplexTask, new ComplexTaskRDBMapper()); 
     } 
     catch (ClassNotFoundException e) {} 

    } 

    public static synchronized PersistanceFacade getUniqueInstance() { 
     if (uniqueInstance == null) { 
      uniqueInstance = new PersistanceFacade(); 
      return uniqueInstance; 
     } 
     else return uniqueInstance; 
    } 

    public void create(UUID oid, Object obj) { 
     IMapper mapper = (IMapper) mappers.get(obj.getClass()); 
     mapper.create(oid, obj); 
    } 

    @SuppressWarnings("unchecked") 
    public Object read(UUID oid, Class type) { 
     IMapper mapper = (IMapper) mappers.get(type); 
     return mapper.read(oid); 
    } 

    public void update(UUID oid, Object obj) { 
     IMapper mapper = (IMapper) mappers.get(obj.getClass()); 
     mapper.update(oid, obj); 
    } 

    @SuppressWarnings("unchecked") 
    public void destroy(UUID oid, Class type) { 
     IMapper mapper = (IMapper) mappers.get(type); 
     mapper.destroy(oid); 
    } 


} 
+1

Wo definieren Sie Mapper in der Methode create() in mappers.get (obj.getClass());? – CoolBeans

+1

Was passiert, wenn Sie dies in einem Debugger ausführen? Dies sollte Ihnen helfen zu verstehen, was passiert. –

+0

Ich sehe jetzt, dass Mapper im Konstruktor initialisiert wird. Wie rufen Sie create() auf? – CoolBeans

Antwort

1

Meine Vermutung ist, dass Ihr Problem im Konstruktor liegt:

try { 
     SingleTask = Class.forName("SingleTask"); 
     RepeatingTask = Class.forName("RepeatingTask"); 
     ComplexTask = Class.forName("ComplexTask"); 
     mappers.put(SingleTask, new SingleTaskRDBMapper()); 
     mappers.put(RepeatingTask, new RepeatingTaskRDBMapper()); 
     mappers.put(ComplexTask, new ComplexTaskRDBMapper()); 
    } 
    catch (ClassNotFoundException e) {} 

Sie leise die ClassNotFOundException ignorieren. Wenn Sie dem Fang Logging hinzufügen, erwarte ich, dass es Ihnen sagt, dass die Klasse SingleTask nicht gefunden wird, da ich erwarte, dass Sie diese Klassen nicht in das Standardpaket aufgenommen haben.

Aufgrund Ihrer Antwort auf Kommentare diese Klassen sind in der domain. Paket, so können Sie versuchen, zu ändern: Btw

try { 
     SingleTask = Class.forName("domain.SingleTask"); 
     RepeatingTask = Class.forName("domain.RepeatingTask"); 
     ComplexTask = Class.forName("domain.ComplexTask"); 
     mappers.put(SingleTask, new SingleTaskRDBMapper()); 
     mappers.put(RepeatingTask, new RepeatingTaskRDBMapper()); 
     mappers.put(ComplexTask, new ComplexTaskRDBMapper()); 
    } 
    catch (ClassNotFoundException e) { 
     log.warn("Cannot load class", e); 
    } 

, um Ihren Code hinzufügen Protokollierung wird dazu beitragen, die Gründe für ein unerwartetes Verhalten zu finden.

2

Um Class.forName("RepeatingTask") eine Klasse zurückzugeben, müssen Sie eine Klasse persistence.RepeatingTask haben. Aber in Ihrem Kommentar sagen Sie, dass obj.getClass()domain.RepeatingTask zurückgibt so sieht es für mich aus, als ob Sie 2 "RepeatingTask" Klassen oder domain.RepeatingTask einen Untertyp haben.

0

Class.forName("SingleTask"); wirft eine ClassCastException, daher werden Mapper nicht aufgefüllt. Da Sie ClassCastExeption in Ihrem Konstruktor ignorieren, haben Sie diesen Fehler scheinbar übersehen.