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

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

ただいまの
回答率

90.62%

  • Java

    13466questions

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

  • Android

    6394questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 627

Kw6ZG2sV

score 56

タイトル通りですが、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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 10:07

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

    キャンセル

  • 2017/09/07 10:35

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

    キャンセル

  • 2017/09/07 11:16

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

    キャンセル

  • 2017/09/07 14:14

    今のコードでもこのようになっていませんか?

    try {
    //...
    button1.setTag(R.string.list1, data.getJSONArray("data").getJSONObject(i).getInt("test"));
    //...
    } catch (JSONException e) {
    // 何もしていない
    }

    keicha_hrsさんとの議論も進んでいますので、別の原因かもしれませんが。



    キャンセル

  • 2017/09/07 14:51

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

    キャンセル

  • 2017/09/07 14:59

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

    キャンセル

  • 2017/09/07 16:24

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

    キャンセル

  • 2017/09/08 02:42

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

    キャンセル

0

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

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


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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/06 23:33 編集

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

    キャンセル

  • 2017/09/06 23:58

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

    キャンセル

  • 2017/09/07 10: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の時点で間違っているということでしょうか?

    キャンセル

  • 2017/09/07 10: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()の結果と丹念にステップ実行やログ出力を使って調べていくべきじゃないでしょうか。

    キャンセル

  • 2017/09/07 11:15

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

    キャンセル

  • 2017/09/07 12:31 編集

    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を入れてみて試しました。

    キャンセル

  • 2017/09/07 21:09

    妥当ではありません。

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13466questions

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

  • Android

    6394questions

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