Если вы когда-нибудь увидите эти строки и будете искажены, как я, вот что они означают.
Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))
EventDispatchTread.run() line: not available [local variables unavailable]
Дело не в том, что переменные недоступны, потому что они скрываются за пеленой тайны в какой-то сырой библиотеке. Нет-нет, они просто вышли из-под контроля! Это все еще ваша вина, вам все еще нужно найти нуль, и нет, вы не можете винить библиотеку. Важный урок!
Одна из самых неприятных вещей для меня как новичка - это библиотеки! Это отношения любви и ненависти: с одной стороны, они позволяют мне делать то, что я обычно не понимаю, как делать с кодом, который я понимаю, с другой стороны, потому что я не совсем понимаю их, они иногда бросают гаечный ключ в коде, который в остальном работает нормально! Это потому, что я не понимаю ошибок, которые могут возникнуть при использовании этих библиотек, потому что я их не писал, и потому что 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();
}
}
}
У вас нет полной трассировки стека? IIRC, если вы используете JRE из JDK, вы получаете включенную отладочную информацию.




Любой вызов метода для нулевого объекта вызовет исключение нулевого указателя.
В вашем коде правила, имя или отображение может иметь значение null и вызывать исключение.
О да, полностью: но тогда eclipse было бы хорошо об этом и сообщило бы мне в режиме отладки, что rules, name или display имеют значение null. Я смогу понять это. Но ошибка, которую я получаю, не говорит мне об этих трех, она говорит мне о EventDispatchThread.run (), о котором я не писал.
Вы установили точку останова в начале и на протяжении всего действия actionPerformed? Какие ценности на каждом этапе?
многие из них придумывают значение line: not available, потому что это переменные не из моего кода? Мои переменные, правила, имя и отображение не равны нулю. rules и display - большие важные ненулевые части, и name проверяется на null прямо в методе. Правильно?
Бьюсь об заклад, отладчик Eclipse может устанавливать точку останова для бросков. Худшее, что вы могли сделать, - это поставить точку останова в конструкторе исключения нулевого указателя.
Используйте отладчик (например, тот, который включен в Eclipse IDE) и установите точку останова в начале метода actionPerformed (), а затем выполните его построчно, чтобы увидеть, когда переменная, для которой вы пытаетесь вызвать метод, имеет значение null.
но это не переменные, которые я пытаюсь вызвать, имеют значение NULL, переменные с нулевым значением - это те, которые я не вижу, потому что они находятся в awt.event, а не в моем коде? Нет? Я честно ошибаюсь?
Я прошел, как вы сказали, строка за строкой. В какой-то момент он поднимается и говорит, что строка EventDispatchTread.run (): недоступно [локальные переменные недоступны], а затем больше ничего мне не сообщает. там также написано: но я точно знаю, когда это сейчас происходит, и это «перешагивание через» взорвало мне голову!
Вы можете получить исходный код ссылки для классов API (он поставляется с JDK) в eclipse. Но иногда локальные переменные все еще скрыты - я не уверен, от чего это зависит.
Возможно, вы забыли установить ActionCommand.
В Документ API ActionEvent есть примечание относительно возможных нулевых результатов getActionCommand ().
Только не прекращайте читать трассировку стека после двух строк. Где-то в трассировке стека вы узнаете имя одного из написанных вами классов / методов. Начни искать там. (кстати, люди проводят много времени внутри отладчиков :-))
Это очень полезная информация! Я вижу эти сотни строк «недоступно» и думаю: «эй, это не моя вина!» Но на самом деле проблема была внизу.
Добро пожаловать в сложность написания кода графического интерфейса.
Когда вы запускаете программу 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's Swing Tutorial, чтобы узнать больше об этих проблемах.
Хорошо, вот как это ломается: если я использую какую-то библиотеку и получаю от нее нулевой указатель или что-то в этом роде, я почти уверен, что он исходит от МОЕГО КОДА? Сладкий, это хорошо. Просто из-за того, как Eclipse представил это (с, строка недоступна & c ...), казалось, что это могли быть они.
Даже если исключение NullPointerException исходит из библиотеки, трассировка стека покажет, какая строка вашего кода вызвала эту библиотеку. Но только если вы настроили Eclipse для генерации отладочной информации.
Он делал это: я думаю, что произошло то, что, поскольку ошибка не приводила к сбою программы (только потока), переменные, связанные с нулевым значением, вышли из области видимости. Когда я шаг за шагом прошел программу, я смог найти виновника. Спасибо!
Я бы задала ваш бонусный вопрос в новом вопросе