【问题标题】:Java - instance variables mysteriously becoming null in same threadJava - 实例变量在同一个线程中神秘地变为空
【发布时间】: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


【解决方案1】:

这里只能发生两件事

  1. initInstanceVar(); 返回 null
  2. 垃圾收集器不知何故清理了变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多