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

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

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

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

Android

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

Q&A

解決済

2回答

3847閲覧

createScaledBitmapの行でNullPointerExceptionが出るのですが原因が分かりません

ko20vonobird

総合スコア50

Java

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

Android

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

0グッド

0クリップ

投稿2017/07/10 13:36

編集2017/07/12 14:43

###発生している問題・エラーメッセージ
該当の箇所およびそれに関わるところはいじってないはずなのですが、そこでNullPointerExceptionが発生しました。

Process: jpdb.shoichi_vono_kono.airchainsaw, PID: 14213 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference

エラーメッセージにはBitmapのgetWidth()によるとありますが、該当のコードはcreateScaledBitmapで、getWidth()は使ってないのでなぜそうなるのか全く分かりません。

###該当のソースコード(追記)

xml

1<?xml version="1.0" encoding="utf-8"?> 2<FrameLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_height="match_parent" 5 android:layout_width="match_parent"> 6<jpdb.shoichi_vono_kono.airchainsaw.C 7 android:id="@+id/display" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" /> 10</FrameLayout>

上はsurfaceViewを扱っているファイルを含むxmlファイルです。
Cがファイル名です。

java

1protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 Intent ii = getIntent(); 4 BIngo = ii.getBooleanExtra("BINGOOO", false); 5 requestWindowFeature(Window.FEATURE_NO_TITLE); 6 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 7 setNavigationbarHide(this, true); 8 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 9 mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 10 mAccele = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 11 LayoutInflater factory = LayoutInflater.from(this); 12 FrameLayout root = new FrameLayout(this); 13 View view = factory.inflate(R.layout.mix, root); 14 setContentView(view); 15 cccc = (C) findViewById(R.id.display); 16 String h1 = (String) getText(R.string.radar); 17 cccc.setUr(h1); 18 cccc.setBINGo(BIngo); 19 }

使用元のonCreateの部分です

###試したこと
引数を変数から数字に変えたりしてみました。

###追記(関連するメソッドについて)
まず、関連するメソッドはmakeBitmap()とBitmap.createScaledBitmap()です。

java

1DisplayMetrics metrics = new DisplayMetrics(); 2 windowManager.getDefaultDisplay().getMetrics(metrics); 3 int _wDpi = (int)metrics.densityDpi; 4 res = this.getContext().getResources(); 5 6 try { 7 ufo = makeBitmap(_wDpi, res, R.drawable.ufocomp, getWidth(), getHeight()); 8 starmaemae = makeBitmap(_wDpi, res, R.drawable.starskymaemae, getWidth(), getHeight()); 9 starmae = makeBitmap(_wDpi, res, R.drawable.starskymae, getWidth(), getHeight()); 10 starushiro = makeBitmap(_wDpi, res, R.drawable.starskyushiro, getWidth(), getHeight()); 11 starushiroushiro = makeBitmap(_wDpi, res, R.drawable.starskyushiroushiro, getWidth(), getHeight()); 12 ya = makeBitmap(_wDpi, res, R.drawable.yajirushi, getWidth(), getHeight()); 13 }catch (OutOfMemoryError e) { 14 Log.d("OutOfMemory", "happen"); 15 } 16 17 try { 18 ufo = Bitmap.createScaledBitmap(ufo, 150, 150, false); 19 starmaemae = Bitmap.createScaledBitmap(starmaemae, (int) (starmaemaeoutw * 2.5f), (int) (starmaemaeouth * 2.5f), false); 20 starmae = Bitmap.createScaledBitmap(starmae, (int) (starmaeoutw * 2.5f), (int) (starmaeouth * 2.5f), false); 21 starushiro = Bitmap.createScaledBitmap(starushiro, (int) (starushioutw * 2.5f), (int) (starushiouth * 2.5f), false); 22 starushiroushiro = Bitmap.createScaledBitmap(starushiroushiro, (int) (starushiushioutw * 2.5f), (int) (starushiushiouth * 2.5f), false); 23 ya = Bitmap.createScaledBitmap(ya, 175, 175, false); 24 }catch (OutOfMemoryError e) { 25 Log.d("OutOfMemory", "happen"); 26 }

呼び出し順は上の通り、makeBitmap()群が最初で次にBitmap.createScaledBitmap()群が呼ばれるようになっています。
###追記(各値)
wDpi=480, MaxWidth=1080, MaxHeight=1920, scale=0.33333334, max=0.0

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

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

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

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

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

guest

回答2

0

自己解決

お陰様で自己解決致しました。原因は画面遷移の呼び出し元のファイルにおける、インテントの繰り返しで、OutOfMemoryErrorが発生し、それをtry,catchでキャッチしたことによりNullPointerExceptionErrorが発生していました。
なぜそのようなことが発生していたかと言いますと、ハンドラとrunnableの書き順が悪く、インテントした後も繰り返しが発生するようになっているからでした。
ありがとうございました。

投稿2017/07/13 01:26

ko20vonobird

総合スコア50

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

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

0

Bitmap.createScaledBitmapの第一引数で渡しているstarmaemaeがnullかどうかをデバッグして確認しましょう。
nullの場合はcreateScaledBitmapメソッド内でgetWidthを使用していた場合にヌル参照で強制終了すると考えられます。

投稿2017/07/10 14:03

yona

総合スコア18155

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

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

ko20vonobird

2017/07/10 14:36

調べてみた結果、確かにnullになっていました。今までは出来ていたのになぜnullになったのでしょうか、それとも元からnullになっていたのでしょうか?また、create...の前にmakeBitmap()メソッドを介して画像を使用できるようにサイズなどを調整しているのですがそれらを含め、今まで問題なかったのでなおさら混乱しています。
yona

2017/07/10 15:30

原因はわかりません。 いつまでできていて、どのような処理を追加してできなくなったかを思い出すしかありません。 また、OutOfMemoryErrorをキャッチしている箇所をコメントアウトして再度実行してください。
ko20vonobird

2017/07/11 02:37

まずOutOfMemoryErrorをキャッチしている箇所、...=makeBitmap()を含む箇所をコメントアウトしてみましたが、同じエラーが確認されました。 いつまで出来ていたかというと、記憶では、定かではありませんが、SurfaceViewにて円10個を描画する処理を加えてからだと思います。 また、エラーを見ていて気になった、といいますか気づいたのが、エラーの表示ではmakeBitmapメソッドがcreateScaledBitmapより後に実行されているようなのです。書き順ではmakeBitmapメソッドが先に記述されているのですがなぜでしょうか、書き順と逆に実行されることはあるのでしょうか。 また何か思い出したらコメントします。
yona

2017/07/11 02:52

もしかして、ファイル内のメソッドが上から順に実行されていると思っていますか? メソッドについて関連する「メソッド名」と「呼び出し・被呼び出しの関係」と「呼び出し順」を具体的に質問に追記してください。
ko20vonobird

2017/07/11 03:32

ファイル内のメソッドは上から順ではなく呼び出された順番で実行されますよね? 今から追記を始めますので少々お待ちください。
ko20vonobird

2017/07/11 03:45

追記し終えました、関連するコードの全体を追記し、各要素が分かるようにしました。
yona

2017/07/11 03:52

順番が前後するのは他でmakeBitmapを呼んでいるせいで起きている気のせいとかではないですか? makeBitmapで返却しているビットマップがnullかどうかを確認してください。
ko20vonobird

2017/07/11 04:16

makeBitmapはここでしか使ってないです。 makeBitmapで返却された六つのビットマップの内ufoとya以外の四つがnullになっていました。 これは、mekeBitmapに不備があるということでしょうか?
yona

2017/07/11 05:10

そのようですね。 メソッド内の変数を出力して、「nullの時」と「nullではないと時」の値を比較してください。
ko20vonobird

2017/07/11 07:44 編集

一通りメソッド内の出力を比較してみたのですが、どれも同じか数値が存在し、原因が特定できません。しかし、nullであるufo,yaとnullでないものが分かれています。他にどこを調べたらいいなどありますか?
ko20vonobird

2017/07/11 07:54

一つ気付いたことがあるのですが、このmakeBitmapはsurfaceCreated()にて呼び出しているのですが、四回これが四回ほど呼び出されているようなのです。しかし、nullになるのは一回のみでした。
yona

2017/07/11 13:00

「nullであるufo,yaとnullでないものが分かれています。」これはどういった意味でしょうか? 複数回呼ばれているせいかもしれませんね。 各ビットマップを作る時のmakeBitmapに渡されたint wDpi,int MaxWidth,int MaxHeightをログ出力し、質問に追記してください。
ko20vonobird

2017/07/11 15:47

すいません、わかりにくかったですし間違っていますね。私が言いたかったのは、六つのBitmapの内ufoとyaがnullではなく、それ以外の四つがnullということです。
ko20vonobird

2017/07/11 15:50

三つの値を追記しました。
yona

2017/07/11 16:03

おかしい点は無いですね。 scaleとmaxの値も追記してください。 また、各ビットマップはどこでどのような宣言されていますか。
ko20vonobird

2017/07/12 01:26

追記しました。 各ビットマップはprivateと記述する際にdecodeResource()も済ませていたのですが、それではなぜかOutOfMemoryErrorがでてしまったので(画像の容量としては問題ないはず)makeBitmapの中で使えるように済ませるというのが宣言から使えるようにするまでの一連の流れです。
yona

2017/07/12 01:46

リファレンスに下記のような記述がありました。 If the source bitmap is immutable and the requested subset is the same as the source bitmap itself, then the source bitmap is returned and no new bitmap is created. 不変でかつ変更後画像と変更前画像が同じならビットマップを作らずに変更前画像を返却するそうですね。 下記の値を調べてください。 ・Bitmap#isMutableの値 ・変更前ビットマップインスタンス==変更後のビットマップインスタンスの評価値
ko20vonobird

2017/07/12 03:29

_bmのisMutableはfalse、bmpのisMutableはtrueでした。また、変更前ビットマップインスタンスの_bm==変更後のビットマップインスタンスのbmpの評価値はfalseでした。
yona

2017/07/12 03:52

一旦整理しましょう。 ・以前は正常に動いていた。 ・ビットマップは全部で6つある。 ・Bitmapインスタンスはprivateなフィールド変数として宣言されている。 ・makeBitmapメソッドは6つビットマップのうち、一部は正しく初期化するが、一部の初期化に失敗しnullになる。 ・ufo,yaは常に正しく初期化される。 ・starmaemae,starmae,starushiro,starushiroushiroは常にnullになる。 ・makeBitmapメソッド内のローカル変数(wDpi, MaxWidth, MaxHeight, scale, max)は正常な場合も異常な場合も全く同じ値になる。 ・OutOfMemoryErrorは発生していない。 ・ ・不審な点-surfaceCreatedが4回呼ばれている。 ・不審な点-makeBitmapとcreateScaledBitmapの呼び出し順が逆になっている。
ko20vonobird

2017/07/12 04:13

starmaemae,starmae,starushiro,starushiroushiroは常にではないと思います、なぜならsurfaceCreatedが四回ほど呼ばれている中で各四つは一回しかログ出力でnullと確認できていないので。 備考として、OutOfMemoryErrorはLargeHeap=trueにしているのでギリギリ大丈夫なのかと思います。
ko20vonobird

2017/07/12 04:18

あと、max=0.0は通常でありえますか?floatにキャストしているので誤差はあるかもしれませんがきっちり0.0になるかどうか私は疑問に思いました。
yona

2017/07/12 05:25

やはりこの問題よりも先に、なぜ4回もsurfaceCreatedが呼ばれているかを解消すべきかなと思います。 starmaemae等のビットマップインスタンスがnullの場合はリターンし、後続の処理を行わないようにするとどうなりますか? OutOfMemoryErrorはLargeHeapをtrueにしたからと言って解消するわけではありません。OutOfMemoryErrorはキャッチすべきでは無いと思います。 maxについては切り捨てを行なっているので0になりますね。
ko20vonobird

2017/07/12 08:25

nullの場合にreturnする処理と同時に、try文を外したところ、OutOfMemoryErrorのみ発生するようになりました。なので、nullになっていた原因はそれをキャッチしていたからのようです。相変わらずsurfaceCreatedは複数回呼ばれているようですが、時間を見て気になったのが、0.7秒前後時間が空いていました。 なるほど、切り捨てられるのですね。
yona

2017/07/12 08:57 編集

やはりsurfaceCreatedが複数回呼ばれるバグを解消すべきですね。このバグを放置して開発を進めても無駄になりそうです。 今回のバグを説明すると下記の通りです。 1-surfaceCratedが何故か複数回呼ばれる 2-最初の数回はメモリに余裕があるため、6つのビットマップインスタンスは正常に初期化される。 3-複数回呼ばれていくうちにメモリが枯渇し、ビットマップインスタンスが初期化できずnullになってしまう。この時にOutOfMemoryErrorが発生するがキャッチされ、握りつぶされる。 4-ビットマップインスタンスがnullの時にcreateScaledBitmapがヌル参照例外を発生させアプリが終了する。 本来は3で表面化するはずのバグが例外を握りつぶしていたため4で表面化した。
ko20vonobird

2017/07/12 10:24

なるほど、根にある原因は複数回呼ばれるsurfaceCreatedなのですね。しかしなぜなのでしょう?
yona

2017/07/12 10:46

なにが何故なのでしょうか、 複数回呼ばれる理由ですか?
ko20vonobird

2017/07/12 11:18

ええ、なぜ複数回呼ばれるのか、という疑問です。それが原因でメモリが不足しているということですよね。
yona

2017/07/12 12:53

それはわかりません。
ko20vonobird

2017/07/12 13:15

何を調べれば良いでしょうか?私はsurfaceViewを定義したり使っているところの記述を調べてみましたが特にこれといって複数回呼ばれる原因に繋がるような発見はありませんでした。
yona

2017/07/12 13:33

定義ではありません。 使用している箇所を探してください。
ko20vonobird

2017/07/12 14:45 編集

surfaceViewを使っているところを追記しました。
yona

2017/07/12 14:54

元々の質問から大幅に変わる編集は辞めましょう。 元々の質問に対する回答は一連のコメントで回答しているので、この質問にはこれ以上回答するつもりはありません。
ko20vonobird

2017/07/12 15:05

私は下に同じ内容を追記していたのでかつ文字数制限が一万文字というものがあるのでこのような編集を行ったのですが、そのような発言をされることは非常に残念でなりません。しっかりと質問を見ていただいているのであれば分かることだと思うのですが、、、。 なるほど、わかりました。yonaさんもお手上げということですね。
yona

2017/07/12 15:29

はい、頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問