Исключение в потоке "AWT-EventQueue-1" java.lang.NullPointerException error

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

Исключение в потоке "AWT-EventQueue-1" java.lang.NullPointerException

at Culminating1.instructions1(Culminating1.java:69). This line is a simple g.setColor(Color.yellow);.

Мои коды очень грубые и требуют большой работы, поэтому любая помощь ценится.

Вот остальная часть моего кода. Большое спасибо!

import java.applet.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent;
import java.awt.Color.*;

public class Culminating1 extends Applet {

 private Image world, destination, globetrot, rice;

 private Button africa, americas, asia, europe, instructions, japan, china, qatar, uae, thailand;
 private Graphics g = null;

 public void init() {

 this.setLayout(null);
 asia = new Button("Asia");
 africa = new Button("Africa");
 europe = new Button("Europe");
 americas = new Button("Americas");
 instructions = new Button("Instructions");
 add(asia);
 asia.setBounds(10, 120, 65, 25);
 add(africa);
 africa.setBounds(10, 190, 65, 25);
 add(americas);
 americas.setBounds(10, 260, 65, 25);
 europe.setBounds(10, 330, 65, 25);
 add(europe);
 instructions.setBounds(10, 410, 65, 25);

 add(instructions);
 world = getImage(getCodeBase(), "world.gif");
 destination = getImage(getCodeBase(), "Destination2.png");
 globetrot = getImage(getCodeBase(), "GlobeTrot.png");

 } // init method

 @Override
 public void paint(Graphics g) 
 {

 g.setColor(Color.orange);
 g.fillRect(0, 0, 1000, 1000);
 g.drawImage(world, 200, 100, 300, 300, this);
 g.drawImage(destination, 150, 425, 450, 80, this);
 g.drawImage(globetrot, 150, 10, 450, 80, this);

 } // paint method

 @Override
 public boolean action(Event e, Object o) {
 if (e.target == instructions) {
 instructions1();
 } else if (e.target == asia) {
 asia();
 }
 return false;
 }

 public void instructions1() {
 JFrame jp1 = new JFrame();
 Culminating1 a=new Culminating1 ();
 jp1.getContentPane().add(a, BorderLayout.CENTER);
 jp1.setSize(new Dimension(500,500));
 jp1.setVisible(true);

 g.setColor(Color.yellow);
 g.fillRect(0, 0, 1000, 1000);
 Font f;
 f = new Font("Broadway", Font.PLAIN, 20);
 g.setFont(f);
 g.setColor (Color.black);
 g.drawString("Welcome to Globe Trot!", 200, 20);
 g.drawString("In this game you will learn about countries around the world.", 200, 40);
 g.drawString("First choose an area of the world,", 200, 80);
 g.drawString("then at random a well known landscape will appear.", 200, 120);
 g.drawString("Your goal is to guess the country where the landscape is from.", 200, 160);
 g.drawString("If you are unable to guess after 10 seconds a flag will appear", 200, 200);
 g.drawString("from the same country. You have one minute to guess the country", 200, 240);
 g.drawString("before you move onto the next country. There are five in total", 200, 280);
 }

}//Класс проверки

1 ответ

Вы заявляете:

Эта строка представляет собой простой g.setColor(Color.yellow) ;.

Ничего простого об этом. Вы установили g в null в этой строке:

private Graphics g = null;

а затем вызвать метод на нем, и поэтому не должно удивляться, что вы получаете NPE.

Решение:

  • Не вызывайте методы с переменными, установленными в null.
  • В частности, для объекта Graphics не используйте его вне методов рисования, кроме случаев, когда объекты Graphics извлекаются из изображений, таких как BufferedImages.
  • Параметр Graphics для метода paint является переменной параметра и, следовательно, имеет область действия, ограниченную только этим методом. Он не влияет на поле g которое вы используете, и на самом деле тени поля.

Также:

  • Вам лучше создать графический интерфейс Swing, а не графический интерфейс AWT, если только вы не должны создавать AWT-апплеты для класса.
  • Кажется, вы пытаетесь создать Swing JFrame внутри аплета AWT, который действительно не имеет смысла. Какова мотивация этого очень необычного кода?
  • Если вы намерены создать графический интерфейс Swing, тогда у вас не будет расширения вашего класса Applet и нет метода рисования.
  • Если Swing, то у вас должен быть класс, который расширяет JPanel и отменяет его метод paintComponent(Graphics g) и делает всю его рисование.
  • Обычно проще показывать текст в JLabel или в JTextComponent, таком как JTextArea.

редактировать Вы заявляете в комментарии

Спасибо за совет, я буквально понятия не имею, что я делаю, но я хочу использовать графический класс вне метода рисования, так или иначе, я могу это сделать или это невозможно.

Это возможно, но требует трюков.

  • Вы можете получить объект Graphics из BufferedImage и нарисовать его,
  • но вам все равно придется рисовать этот BufferedImage в вашей краске (или, опять же, лучше, метод paintComponent(Graphics g) JPanel.
  • Опять же, если вы просто отправляете текст, вам лучше не использовать объект Graphics вообще, но вместо этого используйте компонент, такой как JLabel, JTextField, JTextArea или что-то подобное.
  • Хороший простой учебник по использованию Swing Graphics можно найти здесь: Урок: Выполнение пользовательской живописи.
  • Более подробную статью можно найти здесь: Картина в AWT и Swing

Изменить 2 Следующий комментарий:

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

Я думаю, что было бы лучше либо обменять текст в текстовом компоненте, либо обменять JPanels с помощью CardLayout.

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

Снова вы можете использовать CardLayout, обменять JPanels от введения JPanel на дисплей JPanel и делать свою графику на дисплее. JPANel paintComponent(Graphics g) переопределяет метод.

licensed under cc by-sa 3.0 with attribution.