Что это за ошибка java.awt.event?
Вопрос
ОТВЕТ:
Если вы когда-нибудь увидите эти строки и будете введены в заблуждение, как это было со мной, вот что они означают.
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() .