1

私はタスクマネージャーを作成しましたが、それは長い話です...ちなみにすべてJavaで作成しました。そこで、以下に示すファサードを作成しました。HashMapに問題があり、構築中にHashMapに追加しようとした値がうまく機能していないのではないかと思います。nullポインタ例外をトリガーしているメソッドは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);
    }


}
4

3 に答える 3

2

クラスを返すにはClass.forName("RepeatingTask")、クラスが必要persistence.RepeatingTaskです。しかし、あなたのコメントでは、それがobj.getClass()返されると言っているので、2つの「RepeatingTask」クラスがあるか、サブタイプであるdomain.RepeatingTaskように見えます。domain.RepeatingTask

于 2010-12-18T11:34:17.267 に答える
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);
    }

ところで、コードにログを追加すると、予期しない動作の背後にある理由を見つけるのに役立ちます。

于 2010-12-18T11:36:17.847 に答える
0

Class.forName("SingleTask");ClassCastException をスローしているため、マッパーはデータを取り込まれません。コンストラクターで無視ClassCastExeptionしているため、そのエラーを見逃しているようです。

于 2010-12-18T11:37:32.487 に答える