0

作業中のゲームに画像をロードしようとしています。クラスで作成したグループ ゲームをパターン化しています。私のパネルクラスでは、画像をロードして背景に描画します。これは機能し、画像を見つけて描画します。

ただし、宇宙船クラスに入れている画像をどのようにロードし、宇宙船のインスタンスを使用して描画しても、null ポインター例外が発生します。画像が見つからないと思いますが、背景画像が正常に取得されたソースフォルダーの同じ場所に配置しました。また、ゲーム画面クラスに空間イメージをロードしてパネルに描画すると、正常に動作します。

2 つのクラスのコードを以下に示します。で画像を読み込んでみました

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

としても:

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

ただし、両方の方法で同じ null ポインターを取得します。私は迷っており、誰かが助けてくれることを願っています。

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);
    }
}

宇宙船.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;
    }
}

スタック トレース エラー

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)
4

2 に答える 2

3

最大の問題は、コメントが (意味的に) コードと一致しないことです。

//creates a spaceship object
SpaceShip space;

これはインスタンスを作成しません。これにより、インスタンスへの参照が作成されますが、インスタンスは作成されません。ですnull。それを (不適切な名前の)panelクラス コンストラクターに渡し、値が含まれているように動作します。しかし、ありません。

NPEまたはそれらの少なくとも 1 つ:

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

少なくとも提供されたコードでは、spaceは初期化されません。

また、これらすべてを 1 つのファイルにまとめないことをお勧めします。

于 2011-12-05T14:43:41.497 に答える
0

変数 spaceShip、missile、launcher はすべて null です。変数をインスタンス化するには、そのコンストラクターを呼び出す必要があります。

//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();

これを行わないと、行のpanel panel1 = new panel(launcher, enemyArray, missileArray);実行時にパネル コンストラクターが を設定しようとしますlauncher = la;。la は現在 null であるため、ここで問題が発生します。

また、パネル クラスの名前をよりわかりやすい名前に変更するか、少なくとも Panel に変更することをお勧めします (Java のクラスは常に大文字で始まる必要があるため)。

お役に立てれば。

于 2011-12-05T14:54:36.247 に答える