2010-12-18 6 views
0

私はタスクマネージャーを書いていますが、それは長年の話です...ところで、Javaですべてのことを書いています。 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

+1

これをデバッガで実行するとどうなりますか?これは、何が起きているのかを理解するのに役立ちます。 –

+0

マッパーがコンストラクタで初期化されるようになったことがわかりました。どのようにcreate()を呼び出していますか? – CoolBeans

答えて

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が見つからないことがわかります。これらのクラスをデフォルトパッケージに入れないと思っています。ところで、あなたのコードへのロギングを追加すると、予期しない動作の背後にある理由を見つけるのに役立ちます

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

は、あなたが変更しようとすることができるように、これらのクラスは、domain.パッケージに含まれていたコメントにお返事を考えます。

2

Class.forName("RepeatingTask")にはクラスを返すには、クラスpersistence.RepeatingTaskが必要です。しかし、あなたのコメントでは、obj.getClass()domain.RepeatingTaskを返すので、2 "RepeatingTask"クラスを持っているか、サブタイプであると思われます。

0

はClassCastExceptionをスローしているため、マッパーにはデータが取り込まれません。コンストラクタでClassCastExeptionを無視しているので、そのエラーを逃してしまったようです。

関連する問題