Pregunta

Estoy tratando de obtener una imagen para cargar en un juego en el que estoy trabajando. Lo estoy modelando después de un juego grupal que construimos en clase. En mi clase de panel cargo una imagen y la dibujo al fondo, esto funciona, encuentra mi imagen y la dibuja.

Sin embargo, no importa cómo cargue la imagen que estoy poniendo en mi clase de nave espacial y la dibujo usando una instancia de nave espacial, me da una excepción de puntero nulo. Nunca encuentra la imagen, supongo, sin embargo, la pongo en la misma ubicación en la carpeta de origen de la que la imagen de fondo se extrae con éxito. Además, si carga la imagen espacial en mi clase Gamescreen y la dibujo al panel, funciona bien.

El código para las dos clases está a continuación. He intentado cargar la imagen con un

spaceship = ImageIO.read(new File("Background.png"));

Tanto como:

Image img = Toolkit.getDefaultToolkit().createImage("spaceShip.png"); 

Pero obtenga el mismo puntero nulo en ambos sentidos. Estoy perdido y espero que alguien pueda ayudar.

package temp;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameScreen extends JFrame {

    //Create an instance of a spaceship object
    SpaceShip spaceship;

    //Create an instance of a missile object
    Missile missile;

    //Create an instance of a launcher object
    Launcher launcher;

    //create an array that holds missile objects
    ArrayList<Missile> missileArray = new ArrayList<Missile>();

    //Creates an array to hold spaceship objects
    ArrayList<SpaceShip> enemyArray = new ArrayList<SpaceShip>();

    int lives = 3;

    public GameScreen() {
        //sets up the panel and the parent frame

        //sets the default specs of the JFrame and adds the panel to it
        this.setSize(600, 700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        //Creates a panel object and adds it to the main frame
        panel panel1 = new panel(launcher, enemyArray, missileArray);
        this.add(panel1);
    }
}

class panel extends JPanel {
    //creates a new launcher object
    Launcher launcher;

    //creates a spaceship object
    SpaceShip space;

    //creates an arraylist of spaceship objects
    static ArrayList<SpaceShip> ships;

    //creates an arraylist of missile objects
    ArrayList<Missile> missiles;

    //loads images to draw 
    Image backGround;

    public panel(Launcher la, ArrayList<SpaceShip> ss, ArrayList<Missile> mi) {
        try {
            launcher = la;
            ships = ss;
            missiles = mi;

            backGround = ImageIO.read(new File("Background.png"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void paintComponent(Graphics g) {
        BufferedImage x = new BufferedImage(600, 700, BufferedImage.TYPE_INT_RGB);
        Graphics g2 = x.getGraphics();

        g2.drawImage(backGround, 0, 0, this);

        g2.drawImage(space.img, 0, 0, this);

        System.out.println(ships.size());

        g.drawImage(x, 0, 0, this);
    }
}

Spaceship.java

import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 * @author WymoreJW
 */
class SpaceShip extends Character {

    Image img = Toolkit.getDefaultToolkit().createImage("spaceShip.png");

    public void SpaceShip() {

        this.health = 10;
        this.speed = 2;
    }
}

Error de rastreo de pila

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at missiledefense.panel.paintComponent(GameScreen.java:108)
    at javax.swing.JComponent.paint(JComponent.java:1029)
    at javax.swing.JComponent.paintChildren(JComponent.java:862)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:862)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
    at javax.swing.JComponent.paintChildren(JComponent.java:862)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)

    at    javax.swing.RepaintManager$PaintManager.paintDoubleBuffered
(RepaintManager.java:1479)

    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1780)
    at java.awt.Window.paint(Window.java:3375)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run
(SystemEventQueueUtilities.java:125)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters
(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy
(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
¿Fue útil?

Solución

El mayor problema es que sus comentarios no se alinean con el código (semánticamente):

//creates a spaceship object
SpaceShip space;

Esto no crea una instancia. Esto crea una referencia a una instancia, pero no hay instancia. Es null. Se lo pasas al (mal nombrado) panel Constructor de clase y actúa como si fuera un valor en él. Pero no hay.

los NPE, O al menos, uno de ellos:

g2.drawImage(space.img, 0, 0, this); // *foom*

Al menos en el código proporcionado, space nunca se inicializa.

También recomiendo no encajar todo esto en un solo archivo.

Otros consejos

Sus variables de nave espacial, misiles y lanzador son nulas. Para instanciar una variable, debe llamar a su constructor, por ejemplo

//Actually Create an instance of a spaceship object
SpaceShip spaceship = new SpaceShip();

//Actually Create an instance of a missile object
Missile missile = new Missile();

//Actually Create an instance of a launcher object
Launcher launcher = new Launcher();

Si no haces esto, entonces cuando la línea panel panel1 = new panel(launcher, enemyArray, missileArray); se ejecuta el constructor del panel intentará establecer launcher = la;. El problema viene aquí, ya que LA es actualmente nulo.

También recomendaría cambiar el nombre de su clase de panel a algo más descriptivo, o al menos al panel (ya que las clases en Java siempre deben comenzar con una letra mayúscula).

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top