在事件处理中属性变为null

时间:2009-12-23 15:46:24

标签: java null listener

在简化版中,我所拥有的是:

public class MyLabel extends JLabel implements MouseListener{
private SomeControl control;

public MyLabel(SomeControl control){
    this.addMouseListener(this);
    this.control = control;
}

@Override
public void mouseClicked(MouseEvent arg0) {
    Object x = this.control.getSomeProperty();
}

即使我在构造MyLabel实例时调试并验证控件及其someProperty不为null,当事件被触发并且处理程序进入时,它会将someProperty显示为null,这可能是什么问题?

3 个答案:

答案 0 :(得分:1)

如果可以,请将代码更改为:

(编辑:早上太早..忘了最后一句: - )

private final SomeControl control;

你必须在构造函数中执行“control = new ......”,但如果你只想在一个地方分配它,那么这就是让编译器帮助你的方法。 / p>

另外,你确定NullPointerException不在方法调用中吗?

  

它显示someProperty就像它一样   null,这可能是什么问题?

基于我假设我误解了你在说什么......你是说someProperty()方法调用返回null?如果是这种情况,请执行以下操作:

    SomeControl类中的
  • 将someProoerty变量标记为final(如果可能)。这意味着您不能拥有setProperty(....)方法。
  • 如果你不能使变量final将以下代码添加到setProperty(...)方法中:

...

public void setPropert(... value)
{
    if(value == null)
    {
        throw new IllegalArgumentException("value cannot be null");
    }
}

然后你会看到代码的哪一部分将属性设置为null。

答案 1 :(得分:1)

MyLabel构造函数中,当control添加为this时,MouseListener的值为空(default}。如果此时调用了侦听器,它将看到null值。随后,在调试器报告时,使用非null参数值更新control值。我怀疑异常可能是转义this,正如here所述。

答案 2 :(得分:0)

我很确定该属性在代码中的其他位置设置为null。 您可以尝试在someProperty字段上设置观察点并进行调试以查看它何时变为空。

或者您可以为我们提供一些可编辑的代码,因此我们可以自己尝试。