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

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

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

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

Q&A

解決済

1回答

413閲覧

Exception in thread "main" java.lang.NullPointerException以下略のエラーの解決方法を教えてください

Alpa

総合スコア80

Java

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

0グッド

0クリップ

投稿2017/08/05 14:16

Javaの質問で以下のプログラムをコマンドプロントでコンパイルはできるのですが
実行した時に以下のエラーが出ます
どのようにしたらしっかりと実行できるようになるでしょうか?
変更したらいい部分などを教えてください!
回答よろしくお願いします

エラー文 Exception in thread "main" java.lang.NullPointerException at MyFrame.suraimu(MyFrame.java:175) at MyFrame.addMonster(MyFrame.java:128) at MyFrame.createBasePanel(MyFrame.java:93) at MyFrame.<init>(MyFrame.java:35) at part18.main(part18.java:8)

JAVA

1import javax.swing.JFrame; 2import javax.swing.JLabel; 3import java.awt.Color; 4import java.awt.Font; 5import java.awt.Image; 6import javax.swing.JPanel; 7import java.io.File; 8import java.awt.image.BufferedImage; 9import javax.imageio.ImageIO; 10import javax.swing.ImageIcon; 11 12public class MyFrame extends JFrame 13{ 14 15 JLabel jlMsg; 16 JPanel jpChild2; 17 BufferedImage ba1; 18 BufferedImage ba2; 19 BufferedImage ba3; 20 21 public MyFrame()throws java.io.IOException//コンストラクタ化 22 { 23 24 File file1=new File("[Monster]Bat_pochi.jpg");//コウモリのファイル読み込み 25 ba1=ImageIO.read(file1);//コウモリ画像全体を読み込む 26 27 File file2=new File("[Monster]Goblin1_tapis.jpg");//ゴブリンのファイル読み込み 28 ba2=ImageIO.read(file2);//ゴブリン画像全体を読み込む 29 30 File file3=new File("[Monster]Slime1_pochi.jpg");//スライムのファイル読み込み 31 ba3=ImageIO.read(file3);//スライム画像全体を読み込む 32 33 setBounds(20,40,940,540);//フレームサイズ変更 34 setDefaultCloseOperation(EXIT_ON_CLOSE);//×ボタン有効化 35 add(createBasePanel());//親パネル作成しフレームに貼り付け 36 setVisible(true);//フレームを表示状態へ 37 38 enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK);//キー入力有効化 39 40 } 41 42 protected void processKeyEvent(java.awt.event.KeyEvent e) 43 { 44 if(e.getID()==java.awt.event.KeyEvent.KEY_PRESSED){ 45 System.out.println("キー"+e.getKeyCode()+"が押されました"); 46 if(e.getKeyCode()==java.awt.event.KeyEvent.VK_1){ 47 jlMsg.setText("魔王と戦い勝利しました"); 48 } 49 if(e.getKeyCode()==java.awt.event.KeyEvent.VK_2){ 50 jlMsg.setText("修行して強くなった"); 51 } 52 if(e.getKeyCode()==java.awt.event.KeyEvent.VK_3){ 53 jlMsg.setText("宿屋に泊まった"); 54 } 55 } 56 } 57 58 //基盤パネルを作成 59 JPanel createBasePanel()throws java.io.IOException 60 { 61 JPanel jp=createPanel(Color.BLACK); 62 63 //フォントを作成 64 Font f=new Font(Font.MONOSPACED,Font.BOLD,40); 65 66 67 //レイアウト1行目 68 //パネルを作成し親パネルに貼り付け 69 JPanel jpChild=createPanel(Color.BLUE);//小パネル作成 70 jp.add(jpChild);//親パネルにパネル追加 71 72 //ラベルを作成し子パネルに貼り付け 73 JLabel jlChild=new JLabel(player.getStatusString());//文字列作成 74 jlChild.setFont(f);//文字サイズ変更 75 jlChild.setForeground(Color.WHITE);//文字色設定 76 jpChild.add(jlChild);//子パネルに文字追加 77 78 79 //レイアウト2行目 80 81 //可変表示パネル 82 JPanel jpChild2=createPanel(Color.CYAN);//小パネル作成 83 jp.add(jpChild2);//親パネルにパネル追加 84 /* 85 //選択肢をパネルに貼り付け 86 JLabel jlMain=new JLabel( 87 "<html>1.すぐに魔王を倒しに行く<br>2.修行する<br>3.宿屋に泊まる" 88 ); 89 jlMain.setFont(f); 90 jpChild2.add(jlMain); 91 */ 92 93 addMonster(); 94 95 //レイアウト3行目 96 //ラベルを作成し親パネルに貼り付け 97 jlMsg=new JLabel("魔王が世界を滅ぼそうとしています");//文字入力 98 jlMsg.setFont(f);//文字サイズ変更 99 jlMsg.setForeground(new Color(255,128,0));//文字色設定 100 jp.add(jlMsg);//ウィンドウに文字追加 101 102 System.out.println("プログラムを全て読み込みましました!");//読み込み確認 103 return(jp); 104 105 } 106 107 108 109 //ここより以降は関数作成コード 110 111 //パネルを作成し背景色を設定する関数 112 JPanel createPanel(Color c) 113 { 114 JPanel jp=new JPanel(); 115 jp.setBackground(c); 116 return(jp); 117 } 118 119 120 void addMonster() 121 { 122 123 int cw=32;//セルサイズ/幅 124 int ch=48;//セルサイズ・高さ 125 int sw=32*4;//表示サイズ・幅 126 int sh=48*4;//表示サイズ・高さ 127 128 suraimu(jpChild2,ba3,0,0,cw,ch,sw,sh);//スライム表示の関数を呼び出して村人の正面の画像を表示する 129 koomori(jpChild2,ba1,0,0,cw,ch,sw,sh);//コウモリ表示の関数を呼び出して村人の正面の画像を表示する 130 goburinn(jpChild2,ba2,0,0,cw,ch,sw,sh);//ゴブリン表示の関数を呼び出して村人の正面の画像を表示する 131 } 132 /* 133 134 @param jpChild2 表示対象パネル 135 @param ba0,1,2,3 画像全体 136 @param x 表示する座標X 137 @param y 表示する座標Y 138 @param cw セルの大きさ・幅 139 @param ch セルの大きさ・高さ 140 @param sw 表示サイズ・幅 141 @param sh 表示サイズ・高さ 142 143 */ 144 145 void koomori(JPanel jpChild2,BufferedImage ba1,int x,int y,int cw,int ch,int sw,int sh)//コウモリ表示関数作成 146 { 147 BufferedImage bs1=ba1.getSubimage(cw*x,ch*y,cw,ch); 148 //画像サイズ192*192に変更した画像の左端に切り取り 149 Image im=bs1.getScaledInstance(sw,sh,Image.SCALE_DEFAULT); 150 ImageIcon ii=new ImageIcon(im);//JLabelように型変換 151 JLabel jlImage=new JLabel(ii);//画像部品を作成 152 jlImage.setSize(sw,sh);//画像部品の座標とサイズ変更 153 jpChild2.add(jlImage);//親パネルに画像貼り付け 154 } 155 156 void goburinn(JPanel jpChild2,BufferedImage ba2,int x,int y,int cw,int ch,int sw,int sh)//ゴブリン表示関数作成 157 { 158 BufferedImage bs2=ba2.getSubimage(cw*x,ch*y,cw,ch); 159 //画像サイズ192*192に変更した画像の左端に切り取り 160 Image im=bs2.getScaledInstance(sw,sh,Image.SCALE_DEFAULT); 161 ImageIcon ii=new ImageIcon(im);//JLabelように型変換 162 JLabel jlImage=new JLabel(ii);//画像部品を作成 163 jlImage.setSize(sw,sh);//画像部品の座標とサイズ変更 164 jpChild2.add(jlImage);//親パネルに画像貼り付け 165 } 166 167 void suraimu(JPanel jpChild2,BufferedImage ba3,int x,int y,int cw,int ch,int sw,int sh)//スライム表示関数作成 168 { 169 BufferedImage bs3=ba3.getSubimage(cw*x,ch*y,cw,ch); 170 //画像サイズ192*192に変更した画像の左端に切り取り 171 Image im=bs3.getScaledInstance(sw,sh,Image.SCALE_DEFAULT); 172 ImageIcon ii=new ImageIcon(im);//JLabelように型変換 173 JLabel jlImage=new JLabel(ii);//画像部品を作成 174 jlImage.setSize(sw,sh);//画像部品の座標とサイズ変更 175 jpChild2.add(jlImage);//親パネルに画像貼り付け 176 } 177 178}

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

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

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

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

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

guest

回答1

0

ベストアンサー

考えたら、ファイル入力の失敗は例外が送出されるので、ヌルポにならないですね。失礼しました。

改めまして、createBasePanelメソッド内の次のコードに問題がありました。

Java

1//可変表示パネル 2JPanel jpChild2=createPanel(Color.CYAN);//小パネル作成 3jp.add(jpChild2);//親パネルにパネル追加

ここのjpChild2はローカル変数ですが...
addMonsterメソッドで参照しているjpChild2はクラスMyFrameのフィールドです。
そもそも見ているものが違うんですね。

次のように書き換えてください。

Java

1//可変表示パネル 2jpChild2=createPanel(Color.CYAN);//小パネル作成 3jp.add(jpChild2);//親パネルにパネル追加

このエラー、質問者様の前回の質問と同じ原因ですね...
fiveHundred様が回答されているように、同じ名前の変数が宣言されていることに問題があります。
次回以降、同様のエラーが出たときはこいつを重点的にチェックしてみてください。

残骸

メソッドslimeの、以下の行が怪しいです。

Java

1BufferedImage bs3=ba3.getSubimage(cw*x,ch*y,cw,ch);

ba3の中身が空っぽだと、ご提示のようなエラーが出ます。

ba3は、コンストラクタで初期化されているようですが...

Java

1File file3=new File("[Monster]Slime1_pochi.jpg");//スライムのファイル読み込み 2ba3=ImageIO.read(file3);//スライム画像全体を読み込む

ファイルが正しく開けていないような気がします。
画像ファイルのパスを絶対パスにしたとき、上手く動作するか確認してみてください。

投稿2017/08/05 14:29

編集2017/08/05 15:44
LouiS0616

総合スコア35660

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

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

Alpa

2017/08/05 14:39

わかりましたやってみます
Alpa

2017/08/05 14:47 編集

申し訳ないんですが絶対パスへの変更方法を教えていただけないでしょうか?
LouiS0616

2017/08/05 14:49

過去の質問を見ましたが、OSはWindowsで合ってますでしょうか?
Alpa

2017/08/05 14:53

はいあっています
LouiS0616

2017/08/05 14:55

エクスプローラーで目的のファイルを探し、Shiftキーを押しながら右クリック、『パスのコピー』を選択してください。 そして、プログラムのパスの部分で貼り付けてください。こんな感じになります。 File file3=new File("C:\Users\xxx\Picture\[Monster]Slime1_pochi.jpg"); 円マーク(\)をそのままにしておくとバグるので、\を\\に置き換えてください。
Alpa

2017/08/05 15:00

ありがとうございます
Alpa

2017/08/05 15:06 編集

File file1=new File("C:\\Users\\xxx\\javapro\\[Monster]Bat_pochi.jpg");//コウモリのファイル読み込み ba1=ImageIO.read(file1);//コウモリ画像全体を読み込む File file2=new File("C:\\Users\\xxx\\javapro\\[Monster]Goblin1_tapis.jpg");//ゴブリンのファイル読み込み ba2=ImageIO.read(file2);//ゴブリン画像全体を読み込む File file3=new File("C:\\Users\\xxx\\javapro\\[Monster]Slime1_pochi.jpg");//スライムのファイル読み込み ba3=ImageIO.read(file3);//スライム画像全体を読み込む このように変更しましたが最初のエラーが出ました
LouiS0616

2017/08/05 15:08

ba3 = ImageIO.read(file3); の直後に、 System.out.println(ba3 == null); と打ったらどう出力されますでしょうか?
LouiS0616

2017/08/05 15:14

あ、エラー出てる箇所ここですね。 jpChild2.add(jlImage); ファイルの入出力は関係なさそうです。
LouiS0616

2017/08/05 15:22

原因究明しました。 回答に追記しますので少々お待ちください。
Alpa

2017/08/05 16:12

ありがとうございました これからは重点的にそのような部分を見ていきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問