私のファサードのヌルポインター:(
-
11-10-2019 - |
質問
私はタスクマネージャーを書きました。そこで私はあなたが以下に見ることができるファサードを書きました。そこにはハッシュマップに問題があり、建設中にハッシュマップに追加しようとする値はあまりうまくいかないと思います。 nullポインターの例外をトリガーしている方法は、作成方法です。メソッドへの入力パラメーターは、私と私の信頼できるデバッガーによって検証されています。
ここでの助けは素晴らしいことです...私は何かに言及するのを忘れていると確信しているので、今このことを成し遂げる必要があるので、できるだけ早くコメントに返信します。
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);
}
}
解決
私の推測では、あなたの問題はコンストラクターにあります:
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);
}
ところで、コードにログを追加することは、予期しない動作の背後にある理由を見つけるのに役立ちます。
他のヒント
にとって Class.forName("RepeatingTask")
クラスを返すには、クラスが必要です persistence.RepeatingTask
. 。しかし、あなたのコメントであなたはそれを言います obj.getClass()
戻り値 domain.RepeatingTask
だから、あなたが2つの「リピートタスク」のクラスを持っているように見えますまたは domain.RepeatingTask
サブタイプです。
Class.forName("SingleTask");
ClassCastExceptionを投げているので、マッパーは人口がかかりません。あなたは無視しているので ClassCastExeption
コンストラクターでは、そのエラーを逃したようです。