コード public class Part01 extends Frame{ /** * メインクラス */ public static void main(String args[]){ new Part01(); } /** * コンストラクタ */ public Part01(){ /**フレームの初期化*/ super("Shooting Game"); //タイトル設定 setBounds(0, 0, 500, 500); //位置、サイズ設定 setVisible(true); //表示 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ System.exit(0); } }); /**キャンバスの生成*/ MyCanvas myCanvas = new MyCanvas(); add(myCanvas); //フレームにキャンバスを追加 //スレッドを作成 myCanvas.initThread(); } } public class MyCanvas extends Canvas implements Runnable{ Image imageBuffer; Graphics graphicsBuffer; /** * コンストラクタ */ public MyCanvas(){ } /** * 描画処理 */ @Override public void paint(Graphics g){ g.drawImage(imageBuffer, 0, 0, this); } /** * メインループ */ @Override public void run(){ //オフスクリーンバッファ作成 imageBuffer = createImage(500, 500); graphicsBuffer = imageBuffer.getGraphics(); graphicsBuffer.setColor(Color.white); graphicsBuffer.fillRect(0, 0, 500, 500); } /** * スレッドを初期化する。 */ public void initThread() { Thread thread = new Thread(this); thread.start(); } }
コード public class Part01 extends Frame{ /** * メインクラス */ public static void main(String args[]){ new Part01(); } /** * コンストラクタ */ public Part01(){ /**フレームの初期化*/ super("Shooting Game"); //タイトル設定 setBounds(0, 0, 500, 500); //位置、サイズ設定 setVisible(true); //表示設定 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ System.exit(0); } }); /**キャンバスの生成*/ MyCanvas myCanvas = new MyCanvas(); add(myCanvas); //フレームにキャンバスを追加 } } public class MyCanvas extends Canvas implements Runnable{ Image imageBuffer; Graphics graphicsBuffer; /** * コンストラクタ */ public MyCanvas(){ Thread thread = new Thread(this); thread.start(); } /** * 描画処理 */ @Override public void paint(Graphics g){ g.drawImage(imageBuffer, 0, 0, this); } /** * メインループ */ @Override public void run(){ //オフスクリーンバッファ作成 imageBuffer = createImage(500, 500); graphicsBuffer = imageBuffer.getGraphics(); graphicsBuffer.setColor(Color.red); graphicsBuffer.fillRect(0, 0, 400, 500); } }
1つ目と2つ目はどちらもフレームにキャンバスを貼り付けて、そこに四角形を描いたプログラムになっています。
違いは1つ目はPart01クラスのコンストラクタでスレッドを呼び出しているのですが2つ目ではMyCanvasクラスのコンストラクタで呼び出している点です。
どっちでも特に変わりはないと思ったのですが、2つ目のほうでは実行するとエラーが出ました。
エラー内容
java.lang.NullPointerException
エラー箇所
graphicsBuffer = imageBuffer.getGraphics();
メソッドで呼び出しているかコンストラクタで呼び出しているかの違いでなぜ2つ目のほうはエラーが出てしますのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/05 08:07