Вопрос

ОТВЕТ:

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

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

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

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

ВОПРОС:

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

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

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();
        }
    }
}
Это было полезно?

Решение

Добро пожаловать в сложность написания графического кода.

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

Ваш код:

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

// more code...
}

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top