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

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

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

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

Android

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

Q&A

解決済

3回答

1192閲覧

ボタンにsetTag(int key,object tag)してgetTag()した際に出たエラー

po_tato

総合スコア97

Java

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

Android

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

0グッド

0クリップ

投稿2017/09/06 10:15

編集2017/09/06 10:15

タイトル通りですが、buttonにsetTagしてそれを利用してonClick処理で判別した部分にエラーが出たのですが、それの解決方法がわかりません。
出たエラーは以下となります。
setTag時のキーはstring.xmlに設定したものを使用しています。
また、エラー箇所はクリック判定部分のif文です


java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference


//ボタン部分 button1.setTag(R.string.list1, data.getJSONArray("data").getJSONObject(i).getInt("test")); //クリック判定部分 @Override public void onClick(View v) { if (v.getTag(R.string.list1).toString() == "0") { }
//string.xml <resources> <string name="list1">1</string> <string name="list2">2</string> </resources>

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

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

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

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

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

guest

回答3

0

自己解決

結局考え方自体を違うものにして解決しました。
ですので、このエラー自体は解決できませんでしたが解決済みとさせて頂きます。

デバッグ方やエラー箇所の見方など様々な知識を取り入れられたのは
皆さんのおかげです。ありがとうございました。

投稿2017/09/11 01:59

po_tato

総合スコア97

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

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

0

v.getTag(R.string.list1).toString() が NullPointerException に
なっているということですから、そもそも

java

1button1.setTag(R.string.list1, data.getJSONArray("data").getJSONObject(i).getInt("test")); 2

が正しく動作しているのかが気になります。
JSONException が発生して setTag() が完了せず進み、結果 getTag() が null、
ということはないでしょうか?

keicha_hrsさんのおっしゃる通り、クリック判定部分も正しくないと思います。

投稿2017/09/06 13:58

daisuke7

総合スコア1563

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

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

po_tato

2017/09/07 01:07

コメントいただきありがとうございます! ご指摘の通り、setTagが正しくないのだと思うんですが、わからない辛い状況です。解決に努めたいと思います。
daisuke7

2017/09/07 01:35

JSONExceptionを握りつぶしている(catchしても何もしてない)ということはないでしょうか?
po_tato

2017/09/07 02:16

どこかにtry....cahtc文を追加してやるということでしょうか?
daisuke7

2017/09/07 05:14

今のコードでもこのようになっていませんか? try { //... button1.setTag(R.string.list1, data.getJSONArray("data").getJSONObject(i).getInt("test")); //... } catch (JSONException e) { // 何もしていない } keicha_hrsさんとの議論も進んでいますので、別の原因かもしれませんが。
po_tato

2017/09/07 05:51

はい、なっています。 このように記載しています。 try{ .... } catch (JSONException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); }
daisuke7

2017/09/07 05:59

e.printStackTrace(); を書いているのであれば、スタックトレースがデバッグログに出ていませんか?
po_tato

2017/09/07 07:24

出ていますが、これについて書かれていることは特になさそうでした。。
swordone

2017/09/07 17:42

何をもってして「特になさそう」なのか理解に苦しみます。 「出ている」時点で大問題のはずなのですが。
guest

0

getInt()としているのだから、setTag()の第2引数に与えているのはint型の値なのですよね?それならば、getTag()の方では

java

1 if ((Integer) v.getTag(R.string.list1) == 0) { 2 }

のような評価をしなければ思ったような結果は得られないのではないですか?

java

1 if (v.getTag(R.string.list1).toString().equals("0")) { 2 }

のようにしてもいいのだろうけど、回りくどいような・・・。

どちらにしても、String型を==で評価してはいけません。

投稿2017/09/06 10:44

編集2017/09/06 14:57
keicha_hrs

総合スコア6766

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

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

swordone

2017/09/06 14:34 編集

getTagの返り値はObjectなので、 if ((Integer)v.getTag(R.string.list1) == 0) とキャストしないといけないですね。 まあ結局返り値がnullであればNullPointerExceptionですが。
keicha_hrs

2017/09/06 14:58

恐れいります。ご指摘の部分、訂正しました。
po_tato

2017/09/07 01:05

お教えして頂きありがとうございます。 一番目のif分の場合、 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference 2番目の場合は、 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference このエラーが出てしまいました。 これはもうsetTagの時点で間違っているということでしょうか?
keicha_hrs

2017/09/07 01:37

v.getTag(R.string.list1)の結果がnullなのだろうと思いますが。視覚的に確認するなら、 Object tag = v.getTag(R.string.list1); if ((Integer) tag == 0) { } のようにしてみて、if文の行にブレークポイントを設定(Ctrl+F8)してデバッグ実行(Shift+F9)してみたらどうでしょうか。ブレークすると画面下側にDebugウィンドウが開き、その中にVariablesというウィンドウがあります。そこに変数が一覧されますから、tagの内容も見られるでしょう。まあ、nullなのでしょうが。 setTag()でも、第2引数に data.getJSONArray("data").getJSONObject(i).getInt("test") のような一気呵成な記述をするのではなく、dataの値、getJSONArray()の結果、getJSONObject()の結果と丹念にステップ実行やログ出力を使って調べていくべきじゃないでしょうか。
po_tato

2017/09/07 02:15

お教え頂いた通り実行したところtag=nullと出ていました。デバッグ等のやり方も丁寧にお教え頂きありがとうございました。大変勉強になりました。少しずつ調べてみます。
po_tato

2017/09/07 03:35 編集

Object object = data; Log.d("object", String.valueOf(object)); Object object2 = data.getJSONArray("data"); Log.d("object2", String.valueOf(object2)); Object object3 = data.getJSONArray("data").getJSONObject(1); Log.d("object3", String.valueOf(object3)); Object object4 = data.getJSONArray("data").getJSONObject(1).getInt("test"); Log.d("object4", String.valueOf(object4)); このようにlogに出力して調べたのですが、最終的に知りたい値のobject4の値は0と無事しっかりとした値がsetされているのだと思いましたが、これはgetTagがダメだと判断するのが妥当でしょうか?? getJSONObhect(i)には1を入れてみて試しました。
keicha_hrs

2017/09/07 12:09

妥当ではありません。 setTag()前後のコードはどうなっているのでしょうか?iという変数を用いているわけですが、何かループ処理の中でsetTag()しているのですか?プログラム構造の誤りでそもそもsetTag()が実行されていないとか、ループ条件が不正でgetJSONObject(i)で正しい値が得られないようなiの値を取っているとか、前後のコードによってはいろいろな原因が考えられるでしょう。それ以上はコードがわからないことには何とも言えません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問