0

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

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 不为空,但当事件被触发并且处理程序介入时,它显示 someProperty 就好像它为空一样,这可能是什么问题?

4

3 回答 3

1

如果你能做到,将代码更改为:

(编辑:早上太早了.. .forgot the word final :-)

private final SomeControl control;

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

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

它显示 someProperty 好像它是空的,这可能是什么问题?

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

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

...

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

然后您将看到代码的哪一部分将属性设置为空。

于 2009-12-23T16:07:20.967 回答
1

MyLabel构造函数中control当添加为. 如果此时调用了侦听器,它将看到空值。随后,如调试器报告的那样,使用非空参数值更新该值。我怀疑异常可能是逃跑的,正如这里所讨论的。thisMouseListenercontrolthis

于 2009-12-23T18:59:14.297 回答
0

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

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

于 2009-12-23T15:52:11.393 回答