2010-12-18 20 views
0

我已經寫了一個任務管理器,好吧,這是一個很長的故事......所有的東西都在Java中,所以我寫了一個Facade,你可以在下面看到有一個問題用HashMap和我懷疑在構造過程中試圖添加到HashMap中的值不太好,觸發空指針異常的方法是create方法,該方法的輸入參數已被驗證通過我和我可信的調試器來填充。空指針在我的門面:(

這裏的任何幫助都會很棒......我確定我忘了提及一些東西,所以我會立即回覆評論,因爲我現在需要完成這個任務。

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

你在mappers.get(obj.getClass())中的create()方法中定義映射器的位置;? – CoolBeans 2010-12-18 10:52:58

+1

當你在調試器中運行時會發生什麼?這應該有助於你理解發生的事情。 – 2010-12-18 10:56:52

+0

我現在看到映射器在構造函數中被初始化。你怎麼調用create()? – CoolBeans 2010-12-18 10:59:06

回答

1

我的猜測是,你的問題就出在構造函數:

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) {} 

你默默地忽略ClassNotFOundException。如果您將日誌記錄添加到捕獲,我期望它會告訴您找不到類SingleTask,因爲我預計您沒有將這些類放在默認包中。

鑑於您的回覆意見,這些類都在domain.包,所以你可以嘗試更改爲:

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); 
    } 

順便說一句,添加日誌到您的代碼,將有助於找到背後意外行爲的原因。

2

對於Class.forName("RepeatingTask")要返回一個類,您必須有一個類persistence.RepeatingTask。但在你的評論中,你說obj.getClass()返回domain.RepeatingTask所以它看起來像我有2個「RepeatingTask」類或domain.RepeatingTask是一個子類型。

0

Class.forName("SingleTask");拋出一個ClassCastException,因此映射器不會被填充。由於您在構造函數中忽略ClassCastExeption,因此您似乎錯過了該錯誤。