Атрибут становится нулевым в обработке событий - PullRequest
0 голосов
/ 23 декабря 2009

в упрощенном варианте, что у меня есть это:

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 ]

1 голос
/ 23 декабря 2009

, если вы можете сделать это, измените код на:

(РЕДАКТИРОВАТЬ: слишком рано утром .... Забыть слово окончательный: -)

private final SomeControl control;

Вам нужно будет выполнить «control = new ......» в конструкторе, но если вы хотите, чтобы он был назначен только в одном месте, это способ заставить компилятор вам помочь. 1006 *

Кроме того, вы уверены, что исключение NullPointerException отсутствует в вызове метода?

это показывает someProperty, как будто это было null, в чем здесь может быть проблема?

Исходя из этого, я предполагаю, что неправильно понял, что вы говорили ... Вы говорите, что вызов метода someProperty () возвращает ноль? Если это так, то сделайте следующее:

  • в классе SomeControl пометить переменную someProoerty как окончательную (если это возможно). Это означает, что у вас не может быть метода setProperty (....).
  • если вы не можете сделать окончательную переменную, добавьте следующий код в метод setProperty (...):

...

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

тогда вы увидите, какая часть кода устанавливает свойство в null.

1 голос
/ 23 декабря 2009

В конструкторе MyLabel значение control равно нулю ( по умолчанию ) при добавлении this в качестве MouseListener. Если слушатель был вызван в этот момент, он увидит нулевое значение. Впоследствии значение control обновляется ненулевым значением параметра, как сообщает отладчик. Я подозреваю, что аномалия может быть сбежавшей this, как обсуждено здесь .

0 голосов
/ 23 декабря 2009

Я почти уверен, что свойство установлено на null где-то еще в вашем коде. Вы можете попробовать установить точку наблюдения в поле someProperty и отладить, чтобы увидеть, когда она станет нулевой.

Или вы можете предоставить нам какой-нибудь скомпилированный код, чтобы мы могли попробовать его сами.

...