【发布时间】:2015-04-28 17:28:56
【问题描述】:
我在 Java 中遇到了一些事情,让我非常抓狂,试图弄清楚发生了什么。
我创建了一个对象 objA,并在其构造函数中将此对象添加到另一个对象 objB:
objB.addListener(this);
稍后,在objA上调用了一个方法,它调用了objB中的一个方法,然后又回调了objA:
objA.doSomething() => objB.doSomethingAlso => objA.doSomethingElse()
objA.doSomething();
在 objA 中:
public void doSomething() {
_instanceVar = initInstanceVar();
objB.doSomethingAlso();
}
在 objB 中:
public void doSomethingAlso() {
...
getRefToObjA().doSomethingElse();
}
再次在 objA 中:
public void doSomethingElse() {
_instanceVar.someMethod();
}
但是,当调用 doSomethingElse() 时,_instanceVar(一个实例变量!)现在为空。它在 doSomething() 中被初始化为非空值……那么它现在怎么可能为空呢?它没有在任何地方显式设置为 null。而且所有这些方法调用(就我而言是显而易见的)都发生在同一个线程中。
我在这里缺少什么?那个实例变量怎么可能是空的?
【问题讨论】:
-
你能展示你所有的代码吗?
-
如果是线程问题,每个细节都很重要 - 您应该发布mcve
-
里面有什么:initInstanceVar();?
-
可能你正在传递一个未初始化的对象引用(在构造期间),其中
_instanceVar在读取时是null。 -
我会说问题来自您试图通过调用
getRefToObjA()获取doSomethingAlso()的objA 引用。也许这不会返回您期望的 objA。请按照@assylias 的要求显示更多代码,以便我们提供帮助(尽管我认为这不是线程问题)。
标签: java multithreading variables null instance