以下のプログラムですが、どうしても com.nttdocomo.io.ConnectionException java.lang.NullPointerException の
エラーメッセージが出てしまいます。助けて下さい、、、
Image[] image=new Image[1];//イメージ変数
void exe(){ //実行部分
int i;
//イメージファイル読み込み
try {
MediaImage m;
for (i=0;i<2;i++) {
m=MediaManager.getImage("resource:///"+i+".gif");
m.use();
image[i]=m.getImage();
}
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
g.lock();//描画開始
g.drawImage(image[0],5,140);
g.unlock(true);
}
まずは
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
の部分を
} catch (Exception e) {
e.printStackTrace();
}
に変更してエラーが発生している場所を詳しく洗い出しましょう。
その結果を提示してもらえるとあらためて回答できると思います。
m=MediaManager.getImage("resource:///"+i+".gif");
m.use();
image[i]=m.getImage();
実行途中で調べてみると、m.uce();で止まる様です、、、。
Image[] image = new Image[1]
なのにループで2回回してるからでは?
for (i = 0; i < 1; i++) {
----
}
つまりimage[0]しかないのにimage[1]まで参照してるってこと。
すいません、、、違うようです、、、(;;)
image[1]をimage[2]にしても結果は変わりませんでした。
m=MediaManager.getImage("resource:///"+i+".gif");
m.use();
image[i]=m.getImage();
実行途中で調べてみると、m.uce();で止まる様です、、、。
http://acerola.org/motokazu/iap/manual/Doja4.0/com/nttdocomo...
ConnectionException にはステータスが入っていて、getStatus() メソッドで取得できる様なので、それを表示して原因を探りましょう。
標準出力から確認できるならこんな感じに変更することになります。
catch (Exception e) { System.out.println(e.getClass().getName()); }
↓
catch (com.nttdocomo.io.ConnectionException e) { System.out.println("status="+e.getStatus(); }
適切でなければ、ステータスを確認できる様にしてくださいね。
メッセージに出てくる status を確認して、JavaDoc の「フィールドの概要」のところにあるステータスの番号から、実際は何のエラーなのか? を確認してみましょう。
ありがとうございます、無事解決致しました。
調べたところ、画像ファイルの名前がちがっていました、、、。お恥ずかしい限りです、、、。
今回の間違いで、チェックの仕方を学びました。今後もよろしくお願いいたします。
gが宣言されていないような気がするのですが?。
gは何のオブジェクトでしょう?。
gがnullなのだとすると、nullPointerExceptionを吐きますよね?。
上で言われているように、printStackTraceして、
なにがnullなのかを示していただくと、
よりわかりやすい回答が寄せられると思いますよ。
gが原因では、ありませんでした。ソースを全部かけなかったので、、、。混乱させて申し訳ありません。
今度ともよろしくお願いいたします。ありがとうございました。
リソースフォルダ(resという名前のフォルダ)内に0.gifという名前の適当な画像ファイルはありますか?
まずは配列を使わないで挑戦してみてはいかがでしょう?
//イメージ変数 Image image; void exe(){ //実行部分 //イメージファイル読み込み try { MediaImage m = MediaManager.getImage("resource:///1.gif"); m.use(); image = m.getImage(); } catch (Exception e) { // System.out.println(e.getClass().getName()); e.printStackTrace(); } g.lock();//描画開始 g.drawImage(image, 5, 140); g.unlock(true); }
その上で、(1.gifがあるか確認し、)
//イメージ変数 Image[] image = new Image[2]; void exe(){ //実行部分 int i; //イメージファイル読み込み try { for(i=0; i<2; i++){ MediaImage m = MediaManager.getImage("resource:///" + i + ".gif"); m.use(); image[i] = m.getImage(); } } catch (Exception e) { // System.out.println(e.getClass().getName()); e.printStackTrace(); } g.lock();//描画開始 g.drawImage(image[0], 5, 140); g.unlock(true); }
とやってみるとよいのではないでしょうか。
わかりやすい解説ありがとうございました。
非常に助かりました。やっぱり、勉強しないといけませんね。
助かりました。今後ともよろしくお願いいたします。
imageに確保した配列の長さが1個分しかないのに、
forループで2個目を入れようとしてるのが原因ですね。
配列の添え字は0から始まるので、image[0]とimage[1]ですが、
newで確保するときは個数を指定するので、[2]にします。
Image[] image = new Image[2];
ファイル名が違っていただけでした、、、。こんなミスではてなを利用してしまいました、、、。恥ずかしいです(;;)
今後ともよろしくお願いいたします。ありがとうございます。
要するに。
m=MediaManager.getImage("resource:///"+i+".gif");
のmがnullなのでは。
ということで
m=MediaManager.getImage("resource:///"+i+".gif");
>if ( m == null ) {
> continue;
>}
m.use();
にするとか。
m.use()、やってみました。ミスの原因は違ったところでしたが、、、(;;)
今後の勉強について、nullなど非常に参考になりました。
今後もよろしくお願いします。Perlとは全く違った考え方でちょっと混乱しています(^^;)
ありがとうございました。
あううう、、、すいません、、、エラーの原因がわかりません、、、。