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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

1656閲覧

NullPointerExceptionがメニューボタンを押してアプリから離れた後戻るときに発生します

ko20vonobird

総合スコア50

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/06/12 07:06

編集2017/06/14 02:48

###前提
SurfaceViewを使ってアプリを作っているのですが、一旦androidの端末の右下にあるメニューボタンを押してアプリ一覧に遷移した後再びアプリに戻ろうとすると下記のエラーが出ます。これは半ばソースにも記していますがufoという画像の要素に対してgetWidth()で幅を求めているものです。そこでエラーが出ました。booleanやthreadがnullではないかということを用いてnullの時はそもそも呼び出しがないようにしているつもりなのですがこのようなエラーが出てしまいます。
どのような対策があるのか教えてください、よろしくお願いします。
*新たにエラーが出ました(会話参照)
###発生している問題・エラーメッセージ

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference at jpdb.shoichi_vono_kono.airchainsaw.C.run(C.java:155) at java.lang.Thread.run(Thread.java:818)

###該当のソースコード

java

1@Override 2 public void surfaceCreated(SurfaceHolder holder) { 3 isSurfaceStanby = true; 4 thread = new Thread(this); 5 thread.start(); 6 } 7 @Override 8 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 9 10 } 11 @Override 12 public void surfaceDestroyed(SurfaceHolder holder) { 13 isSurfaceStanby = false; 14 thread = null; 15 if (ufo != null) { 16 ufo.recycle(); 17 ufo = null; 18 } 19 if (starmae != null) { 20 starmae.recycle(); 21 starmae = null; 22 } 23 if (starushiro != null) { 24 starushiro.recycle(); 25 starushiro = null; 26 } 27 } 28@Override 29 public void run() { 30 Canvas c; 31 while (thread != null) { 32 if (!isSurfaceStanby) return; 33 c = holder.lockCanvas(); 34 if (c == null) return; 35 c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);//ここでも同じエラーが出ます 36 if (linebool) { 37 lineh += winH / 20; 38 if (lineh >= winH) { 39 linebool = false; 40 } 41 }else{ 42 lineh -= winH / 20; 43 if (lineh <= 0) { 44 linebool = true; 45 } 46 } 47 winW = getWidth(); 48 winH = getHeight(); 49 if (!isSurfaceStanby) return; 50 if (c == null) return; 51 ufow = ufo.getWidth();//エラーの箇所です 52 ufoh = ufo.getHeight(); 53//省略 54 holder.unlockCanvasAndPost(c); 55 try { 56 Thread.sleep(50); 57 }catch (Exception e) { 58 59 } 60 } 61 }

修正記述↓
//ここから//ここまで、の部分が追記です。

java

1@Override 2 public void surfaceCreated(SurfaceHolder holder) { 3//ここから 4 res = this.getContext().getResources(); 5 ufo = BitmapFactory.decodeResource(res, R.drawable.ufocomp); 6 starmae = BitmapFactory.decodeResource(res, R.drawable.starskymae); 7 starushiro = BitmapFactory.decodeResource(res, R.drawable.starskyushiro); 8//ここまで 9 isSurfaceStanby = true; 10 thread = new Thread(this); 11 thread.start(); 12 }


エラー

java.lang.OutOfMemoryError

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

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

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

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

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

guest

回答1

0

ベストアンサー

ufoはどのように初期化されているのでしょうか?
一度、SurfaceViewが破棄されるとufoはnullになります、その後SurfaceViewを使用する時にufoを初期化する処理は行われていますか?

投稿2017/06/12 07:15

yona

総合スコア18155

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

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

ko20vonobird

2017/06/12 07:35

yonaさん回答ありがとうございます。 ufoは宣言する際にBitmap ufo = ...の形で初期化しておりました。nullになるということはufo = ...の部分をsurfaceCreatedに書いておかないといけないということでしょうか?
yona

2017/06/12 07:44

surfaceCreatedで再初期化するか、この画面に戻ってこないと判断した時に破棄するかのどちらかになると思います。
ko20vonobird

2017/06/12 08:26

返信ありがとうございます。 質問にどのように修正したかを記述させていただいたのですが、四文をsurfaceCreatedに追加したところOutOfMemoryErrorが出ました。使っている画像は変わらないのですがなぜこのようになるのでしょうか?
yona

2017/06/12 08:31

ここだけを見て判断することはできませんね。 このクラスのインスタンスは何個ですか?
ko20vonobird

2017/06/12 08:42

インスタンス、大元のクラスではこのクラス(C)のインスタンスを作ってnewする代わりに=(C) findViewById(R.id.display);としているので0個だと思います。間違っていたら申し訳ないです。
yona

2017/06/12 09:10

ログ出力処理をsurfaceCreatedに追加して何度呼ばれるかを確認しましょう。 また、各画像リソースの容量を教えてください。
ko20vonobird

2017/06/12 09:16

了解しました。 先に画像リソースの容量をお伝えします。 starmae:8.24KB starushiro:12.8KB ufo:3.92KB です。
ko20vonobird

2017/06/12 09:28

surfaceCreatedにログを追加して最初に何回呼ばれるか調べてみたところ、二回呼ばれていました。
ko20vonobird

2017/06/13 08:56

原因かどうか分かりませんが二回呼ばれているということはその分余分に初期化されているということなのでしょうか?
yona

2017/06/13 09:04 編集

そうですね、二回初期化されていると考えられますね。 ただこれだけの容量の画像でアウトオブメモリーが発生するのは変ですね。
ko20vonobird

2017/06/13 14:01

res = ..., ufo = ..., starmae = ..., starushiro = ...の四文を書く位置を変えたりコメントアウトしたりして試してみたのですが、やはり主としてOutOfMemoryErrorが発生してしまいます。また、二回初期化されてその際に余計なことが無いようにif文を使って一回目だけ初期化されるようにと意図して書き換えてみたりしたのですが、依然として同じエラーが発生します。 やはりこの容量の画像でこのエラーは発生しませんよね、どうすれば良いのでしょうか?
yona

2017/06/13 14:05

考えられないですね。 この変更と同時に他の個所でコードを書き換えたりはしていませんか? 質問当初のコードでの初期化処理と新しく追加した4文は同じ処理ですか?
ko20vonobird

2017/06/13 14:44 編集

この変更以外に他の箇所でコードを書き換えたりはしていません。 はい、全く同じの以下四文を処理させています。 res = this.getContext().getResources(); ufo = BitmapFactory.decodeResource(res, R.drawable.ufocomp); starmae = BitmapFactory.decodeResource(res, R.drawable.starskymae); starushiro = BitmapFactory.decodeResource(res, R.drawable.starskyushiro);
ko20vonobird

2017/06/14 04:09

エラーを回避できるかと思いsurfaceCreatedにif(ufo != null && starmae != null && starushiro != null){}で画像.recycle();画像 = null;とする記述を四文の前に書いたところエラーで止まることが数回やってなくなることが確認できました。なぜこれだけしかない容量でこのエラーが出るのかは依然としてわかりませんが、とりあえず表題は解決できたので解決とさせて頂こうかと思います。また同じようなエラーが出た場合は別の質問枠にて質問させて頂こうとおもいます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問