Что это за ошибка java.awt.event? - PullRequest
       23

Что это за ошибка java.awt.event?

1 голос
/ 05 декабря 2008

ОТВЕТ:

Если вы когда-нибудь увидите эти строки и ошибаетесь, как я, вот что они значат.

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

Дело не в том, что переменные недоступны, потому что они скрываются за покровом тайны в библиотеке, где-то сырой. Нет-нет, они просто вышли за рамки! Это по-прежнему ваша вина, вы все равно должны найти ноль, и нет, вы не можете винить библиотеку. Важный урок!

ВОПРОС:

Одна из самых неприятных вещей для меня, как для начинающего, это библиотеки! Это отношения любовь / ненависть: с одной стороны, они позволяют мне делать вещи, которые я обычно не понимаю, как делать с кодом, который я понимаю, с другой стороны, потому что я не совсем понимаю их, они иногда бросают ключ в коде, который в противном случае работает нормально! Это потому, что я не понимаю ошибок, которые могут возникать при использовании этих библиотек, потому что я их не написал, и потому что eclipse не дает мне много работы, когда один из импортеров начинает работать ...

Так вот в чем проблема: я работал с java.awt.event, чтобы обрабатывать кучу JButton на экране для этого и того. Я получаю ошибку, когда использую одну из сделанных мной кнопок. Ошибка:

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

Что это значит? Что может быть причиной? Мне стыдно писать код, но если вы можете попытаться расшифровать мой ужасный стиль, вот метод, который, кажется, вызывает эту ошибку.

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String name;

code...

if(cmd.equals("Play")) {
        name = field.getText();
        card = getCard(name);

        if(card != null) {
            if(rules.zoneHasCard(card, rules.hand)) {
                display.updateStatusMessage(rules.play(card));
                field.setText("");
                display.updateHand(rules.zoneList("hand"));
                display.updateDiscard(rules.zoneList("Discard")); // This is the error here! The discard Zone was empty!
            }
            else {
                field.setText("You do not have " + card.getName());
                field.selectAll();
            }
        }
        else {
            field.setText("That cardname is unused");
            field.selectAll();
        }
    }
}

Ответы [ 5 ]

4 голосов
/ 05 декабря 2008

Добро пожаловать в сложность написания кода GUI.

Когда вы запускаете программу Swing, создается фоновый поток, называемый потоком отправки событий. Когда пользователь нажимает, например, JButton, JButton создает и запускает событие, используя этот поток диспетчеризации событий. Отсюда и название: это поток, который отправляет события!

Ваш код:

public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String name;

// more code...
}

вызывается этим потоком диспетчеризации событий, поэтому ваш код может обработать событие.

Где-то в вашем коде вы пытаетесь что-то сделать с переменной, которая в настоящее время равна нулю. Сообщение об ошибке говорит вам: «эй, запустив некоторый код в потоке отправки событий, я обнаружил исключение NullPointerException» в вашем коде .

Почему вы не получаете больше информации? Возможно, вы настроили Eclipse, чтобы он не включал отладочную информацию при компиляции?

Сейчас я рекомендую добавить несколько строк в ваш метод actionPerformed, чтобы показать состояние переменных:

System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);

Посмотрите, показывает ли это вам нули.

Даже если исключение NullPointerException происходит из библиотеки, трассировка стека покажет, какая строка вашего кода называется этой библиотекой. Но только если вы настроили Eclipse для генерации отладочной информации.

В долгосрочной перспективе изучите учебник Sun Swing, чтобы узнать больше об этих проблемах.

1 голос
/ 05 декабря 2008

Только не прекращайте чтение трассировки стека после двух строк. Где-то в трассировке стека вы узнаете имя одного из классов / методов, которые вы написали. Начни искать там. (кстати, люди проводят много времени в отладчиках: -))

1 голос
/ 05 декабря 2008

Используйте отладчик (например, включенный в IDE eclipse) и установите точку останова в начале метода actionPerformed (), затем построчно просматривайте его, чтобы увидеть, когда переменная, которую вы пытаетесь вызвать метод является нулевым.

1 голос
/ 05 декабря 2008

Любой вызов метода для нулевого объекта вызовет исключение нулевого указателя.

В вашем коде правила, имя или отображение могут быть нулевыми и вызывать исключение.

0 голосов
/ 05 декабря 2008

Возможно, вы забыли установить ActionCommand.

В ActionEvent API Doc есть примечание относительно возможных нулевых результатов getActionCommand ().

...