java对象的getClass()方法返回null

时间:2011-10-30 16:57:47

标签: java serialization reflection

我的理解是,如果java对象xx不为null,那么该对象必须有对应的Class对象才能使用getClass()方法,但有时这个方法返回null at运行时很奇怪。

示例:

对象(oldFact)是ExternalFactUpdateDroolsEvent类中引用的可序列化对象,它在执行过程中被序列化并保存,这意味着第一个ExternalFactUpdateDroolsEvent类型的对象被序列化,后者在执行之前得到去除,在这个过程中,oldFact对象返回导致问题的null Class对象。

我的问题是,如果某个对象不是null getClass()方法如何返回null?这是否与deserilized对象有关,如果没有正确初始化/实例化或其他一些东西,这些对象可能会从不同的JVM序列化,然后在一个JVM上执行。

public class ExternalFactUpdateDroolsEvent implements DroolsEvent {

    private static final long serialVersionUID = -8225631607832350264L;

    private Object oldFact;

    public ExternalFactUpdateDroolsEvent(Object oldFact) {
        this.oldFact = oldFact;
        this.updatedFact = updatedFact;
    }

    public void executeAction(StatefulKnowledgeSession ksession) {
        // some time getClass() returns null that is strange  
        Class factClass = oldFact.getClass();

        ........................
    }

    ......................
}

添加更多内容:

我确定oldFact不为null,因为oldFact.getClass()上没有nullPointer异常;呼叫, 类objecr factClass正被传递给其他的声明,其中null被声明为 我们例外的地方是扔。请参阅下面的代码和例外。 我提前感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

让我猜你在这一行收到NullPointerException:

Class factClass = oldFact.getClass();

由于事实,getClass()不能返回null(编辑:即使getClass()将返回null,这不会导致NullPointerException),oldFact必须是一个这是空的。

答案 1 :(得分:0)

重点是,oldfact为null,因为当您在ExternalFactUpdateDroolsEvent中发送句柄时,您发送一个空指针,因此oldfact仍然是一个空对象,因此当您键入oldfact.getclass()时,无法获取< / p>

编辑 -

如果您在调用executeaction

之前调用方法ExternalFactUpdateDroolsEvent,则会发生这种情况

答案 2 :(得分:0)

Altough有点晚了,我只是看到了这个搜索相同的答案。不应该private Object oldFact;初始化为新对象吗?

private Object oldFact;

为:

private Object oldFact = new Object();