質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2665閲覧

NullPointerException エラーの対処方法

nakamura-

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/10/05 07:13

コード 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つ目のほうはエラーが出てしますのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

動作確認まで行っていませんが、

1つ目のコードではadd(myCanvas);が確実に実行された後にgraphicsBuffer = imageBuffer.getGraphics();が行われます。

2つ目のコードでは、add(myCanvas);graphicsBuffer = imageBuffer.getGraphics();はどちらが先に動くか、状況により変動します。

graphicsBuffer = imageBuffer.getGraphics();が、FrameにCanvasがaddされていることを必要条件とするならば、2つ目のコードにエラーが発生する可能性が生まれてきます。

投稿2016/10/05 07:37

kojisaiki

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/10/05 08:07

回答ありがとうございます! addを先にしとかないとダメでした! ありがとうございました。
guest

0

ベストアンサー

処理の順番が違います。
1つ目はaddしてからスレッドが動き、createImageが呼ばれますが、2つ目はスレッドが動き、creteImageを呼び、addしています。
ここからcreateImageはaddされていない場合はnullを返すように実装されていると推測できます。

投稿2016/10/05 07:27

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/10/05 08:06

回答ありがとうございます! add先にしないとダメでした! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問