0

エラー:「com.vipgamming.Frytree.Game.main(Game.java:47) でスレッド "main" java.lang.NullPointerException で例外が発生しました」

私はあまり上手なプログラマーではありません。ただ言って悪い英語。

ゲーム.java:

package com.vipgamming.Frytree;

import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {

private static final long serialVersionUID = 1L;
public static int width = 300;
public static int height = width /16 * 9;
public static int scale = 3;

private Thread thread;
private JFrame frame;
private boolean running = false;

public Game() {
    Dimension size = new Dimension(width * scale, height * scale);
    setPreferredSize(size);
}

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Display");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    }catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run() {
    while (running) {
            System.out.println("FryTree...Loading...");
        }
    }

    public static void main(String [] args) {
        Game game = new Game();
        game.frame.setResizable(true);
        game.frame.setTitle("Frytree");
        game.frame.add(game);
        game.frame.pack();
        game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        game.frame.setLocationRelativeTo(null);
        game.frame.setVisible(true);

        game.start();
    }
}

申し訳ありませんが、コードを投稿する方法がわかりませんでした。

4

2 に答える 2

4

フレームを使用する前にインスタンス化する必要があります。

game.frame = new JFrame();
game.frame.setResizable(true);
...

これをコンストラクターに入れることもできます。

public Game() {
 this.frame = new JFrame();
 Dimension size = new Dimension(width * scale, height * scale);
 setPreferredSize(size);
}

で定義された設定mainが毎回同じになる場合は、空のものを作成するだけでなく、その全体をコンストラクターに分割できます。そうでない場合は、次のようにコンストラクターをいつでもオーバーロードできます。

public Game() {//base constructor
 this.frame = new JFrame();
 Dimension size = new Dimension(width * scale, height * scale);
 setPreferredSize(size);
}

public Game(JFrame jframe)//injected frame constructor
{
 this.frame = jframe;
 Dimension size = new Dimension(width * scale, height * scale);
 setPreferredSize(size);
}

またはゲームに設定を作成させる

public Game()
{
 this.ConstructFrame();
 Dimension size = new Dimension(width * scale, height * scale);
 setPreferredSize(size);
}

private void ConstructFrame()
{
    this.frame = new JFrame();
    this.frame.setResizable(true);
    this.frame.setTitle("Frytree");
    this.frame.add(game);
    this.frame.pack();
    this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.frame.setLocationRelativeTo(null);
    this.frame.setVisible(true);
}
于 2012-10-08T19:57:56.303 に答える
2

Game.frameどこにも初期化されていないため、NPE です。このフレームの初期化を別のinit方法で保持することをお勧めします。

private void init() {
    frame = new JFrame();
    frame.setSize(400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(true);
    frame.setTitle("Frytree");
    frame.add(this);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

JPanel(また、重量のある AWT の代わりに拡張することをお勧めしCanvasます)

于 2012-10-08T19:58:09.613 に答える