【问题标题】:Attribute becomes null in event handling属性在事件处理中变为空
【发布时间】:2009-12-23 15:46:23
【问题描述】:

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

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 就好像它为空一样,这可能是什么问题?

【问题讨论】:

  • 嗯,对象和属性不只是随机变为空。所以在你的代码的某个地方你有一个错误。我们无法帮助解决问题。如下所示,您需要逐步执行代码来解决问题。这是解决问题的 101。学习如何使用调试器,或学习如何在整个代码中添加 System.out.println(...) 语句。
  • 只是好奇,你为什么把“this”放在方法调用的前面?
  • 无特殊原因,更容易看懂代码
  • 我没有注意到 addMouseListener(this);之前 - 在这种情况下它可能没问题......但一般来说,你不应该在构造函数之外传递“this”,因为它还不是真正有效的(你没有完整的构造函数对象)。

标签: java null listener


【解决方案1】:

MyLabel 构造函数中,当this 作为MouseListener 添加时,control 的值为空(default)。如果此时调用了侦听器,它将看到空值。随后,control 值将使用非空参数值更新,如调试器报告的那样。我怀疑异常可能是逃逸的this,正如here 所讨论的那样。

【讨论】:

    【解决方案2】:

    如果可以的话,把代码改成:

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

    private final SomeControl control;
    

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

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

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

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

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

    ...

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

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

    【讨论】:

    • 我希望这些对象不会失去它们之间的联系,如果我使用新的,那将是与参数中的对象完全不同的对象。这是否意味着我已经与这种类型的作业失去了联系?
    • 如果你只想设置一次,那么使用“final”这个词可以让编译器做到这一点。如果您确实想更改控件,则将其标记为 final 对您不起作用。
    • 好吧,调试器将属性显示为空,所以我认为它不是从内部方法抛出的,但是这变得越来越复杂,我将不得不为此找到另一种解决方法,非常感谢帮助
    【解决方案3】:

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

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

    【讨论】:

    • 这是一个相当复杂的代码,其他人测试它会更加困难,我没有在代码中的任何地方分配null,可能是我没有分配任何东西首先,但为什么我可以看到它正确地“控制”和它的“someProperty”?
    • 我的意思是在构造函数中,似乎所有的属性都很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2010-11-27
    • 2013-08-25
    • 2021-06-27
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多