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

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

ただいまの
回答率

90.12%

Android studio setOnClickListenerもしくはfindViewByIdでNullPointerExceptionの発生

受付中

回答 1

投稿

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

KOOC

score 9

現在クイズアプリを作成しているのですが、NullPointerExceptionが発生して先に進みません。

コード

package com.example.mikawa.myapplication;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;

/**

  • Created by mikawa on 2016/11/18.
    */

public class QuestionActivity extends AppCompatActivity implements View.OnClickListener {

String Seikai;
String QuestionNO;
Button Button4;
int[] getrandom;
int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//タイトルバーを非表示にする
requestWindowFeature(Window.FEATURE_NO_TITLE);
//レイアウトをセットする
setContentView(R.layout.page2_change);

Button4 = (Button) findViewById(R.id.button4);
Button4.setOnClickListener(this);

//SubActivityから送られてきたデータを取得
Intent intent = getIntent();
getrandom = intent.getIntArrayExtra("QuestionNo");

//データを取得する(データがない場合、第2引数の0が返る)
count = intent.getIntExtra("QuestionCo",0);

QuestionNO = String.valueOf(getrandom[count - 1]);

}

@Override
protected void onResume() {
super.onResume();

//画面↑にあるテキストを「問題 + 問題No」で表示
TextView tv =(TextView)findViewById(R.id.textNo);
tv.setText("問題" + String.valueOf(count));

//ボタン処理呼び出し
setQuestion();
}

//ボタンをクリア済みかどうかで色分け&クリック不可処理
private void setQuestion() {
//作成したDBOpenHelperクラスに読み取り専用でアクセス
DBOpenHelper dbOpenHelper = new DBOpenHelper(this);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

/*
SELECT文
テーブル名 MyTableからClearの項目を検索してくる条件式
*/
String sql = "SELECT Pref,Q0,Q1,Q2,Q3 FROM MyTable WHERE _id= " + QuestionNO;

//上記のSELECT文を実行してカーソルを取得
Cursor c = db.rawQuery(sql, null);
c.moveToFirst();

//データベースから取ってきたデータを変数にセット
String teniss = c.getString(c.getColumnIndex("Pref"));//問題文となる都道府県
String choice1 = c.getString(c.getColumnIndex("Q0"));//三択の選択肢1
String choice2 = c.getString(c.getColumnIndex("Q1"));//三択の選択肢2
String choice3 = c.getString(c.getColumnIndex("Q2"));//三択の選択肢3

Seikai = c.getString(c.getColumnIndex("Q3"));//答え

//データベースのクローズ処理
c.close();
db.close();

TextView tv =(TextView) findViewById(R.id.textQuestion);
tv.setText(teniss);//問題文をテキストに表示
RadioButton rb = (RadioButton) findViewById(R.id.RadioButton1);
rb.setText(choice1);//三択の選択肢1をボタンに表示
RadioButton rb2 =(RadioButton) findViewById(R.id.RadioButton2);
rb2.setText(choice2);//三択の選択肢2をボタンに表示
RadioButton rb3 =(RadioButton) findViewById(R.id.RadioButton3);
rb3.setText(choice3);//三択の選択肢3をボタンに表示

}

//選択肢がクリックされた時の処理
public void onClick(View v){
if(v==Button4) {
//遷移先のActivityを指定
//Intent Intent = new Intent(このクラスから、このクラスへ)
Intent intent = new Intent(QuestionActivity.this, QuestionActivity.class);
count++;
intent.putExtra("QuestionCo",count);

//遷移開始
startActivity(intent);
}

}
}

コード

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="left"
android:id="@+id/page2_change">

<TextView
android:layout_width="match_parent"
android:layout_height="25dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textNo"
android:bufferType="editable"
android:layout_gravity="center_horizontal"
android:layout_weight="0.34"
android:background="#58BE89"
android:textColor="#FFFFFF"
android:textSize="26dp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textQuestion"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:textSize="46dp" />

<RadioGroup android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/RadioGroup">
<RadioButton android:text="1"
android:id="@+id/RadioButton1"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
</RadioButton>
<RadioButton android:text="2"
android:id="@+id/RadioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</RadioButton>
<RadioButton android:text="3"
android:id="@+id/RadioButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</RadioButton>
</RadioGroup>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="次の問題へ"
android:bufferType="normal"
android:id="@+id/button4"
android:layout_gravity="right"
android:layout_marginTop="88dp">

</Button>

</LinearLayout>

アプリを実行するとpage2_change.xmlのレイアウトが表示され、1問目は表示されるのですが,"次の問題へ"(Button4)をクリックすると、エラーが起きアプリが強制終了されます。

logcatを見ると、java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mikawa.myapplication/com.example.mikawa.myapplication.QuestionActivity}: java.lang.NullPointerException
と表示されています。

QuestionActivity.javaでButton4.setOnClickListener(this);とtv.setText("問題" + String.valueOf(count));にカーソルを合わせると、may produce 'java.lang.NullPointerException'と言われます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2016/12/16 20:59

    コードの記述方法が間違っているようなので修正してください。

    キャンセル

回答 1

0

IntentにQuestionNoが含まれていないからじゃないでしょうか。

また、エラーがでたならエラーログを質問に追記してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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