简体   繁体   中英

Android app crashes with button click

I'm creating a simple quiz according to this tutorial, but the app crashes with the button "Next answer" which is related to a checked radio button.

Main code:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class Display extends Activity {
    TextView tv;
    Button btnNext;
    RadioGroup rg;
    RadioButton rb1, rb2,rb3;
    String questions[]={"Capital of Portugal?", "Capital of Spain?", "Capital of France?"};
    String answers[]={"Lisbn","Madrid","Paris"};
    String options[]={"Zuriq", "London","Lisbon","Manchester","Buenos Aires","Madrid", "NY", "Paris","Moscow"};

    int flag=0;

    public static int marks,correct,wrong;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dispaly);

        tv=(TextView) findViewById(R.id.tvque);
        btnNext=(Button) findViewById(R.id.btnNext);
        rb1= (RadioButton) findViewById(R.id.radioButton);
        rb2= (RadioButton) findViewById(R.id.radioButton2);
        rb3= (RadioButton) findViewById(R.id.radioButton3);

        tv.setText(questions[flag]);
        rb1.setText(options[flag*3]);
        rb2.setText(options[(flag*3)+1]);
        rb3.setText(options[(flag*3)+2]);

        Toast.makeText(this, "Negative Marks: " + MainActivity.tbflag,   1000).show();

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            //The error comes from the line bellow, i believe:

                RadioButton user_answer=  (RadioButton)findViewById(rg.getCheckedRadioButtonId());
                String answerText=user_answer.getText().toString();

                if(answerText.equalsIgnoreCase(answers[flag])){
                    correct++;
                }else{
                    wrong++;
                    flag++;
                    if(flag<questions.length){
                        tv.setText(questions[flag]);
                        rb1.setText(options[flag*3]);
                        rb2.setText(options[(flag*3)+1]);
                        rb3.setText(options[(flag*3)+2]);
                    }
                    else
                    {
                        if(MainActivity.tbflag)
                        {
                            marks=correct-wrong;
                        }
                        else
                        {
                            marks=correct;
                        }
                        Intent in =new Intent(getApplicationContext(), ResultActivity.class);
                        startActivity(in);
                    }
                }
            }
        });
    }
}

Log message:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.RadioGroup.getCheckedRadioButtonId()' on a null object reference

I don't understand this error, why isn't the method being called? Can someone help?

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.vtorferreira.anew.MainActivity">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tvque"
    tools:text="Questions" />
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/group">
    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="32dp"
        android:id="@+id/radioButton" />

    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/radioButton"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/radioButton2" />

    <RadioButton
        android:text="RadioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/radioButton3"
        android:layout_below="@+id/radioButton2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RadioGroup>

<Button
    android:text="Next Question"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="60dp"
    android:layout_marginStart="60dp"
    android:layout_marginBottom="125dp"
    android:id="@+id/btnNext" />
 </RelativeLayout>

The reason you are getting the first NullPointerException is because you must inflate rg before it is used.

The second NullPointerException is possibly due to the fact that you are pressing the "Next" button with no radio button selected. To prevent this, you can add a null check inside the OnClickListener or select one of the radio buttons by default. To select a radio button by default, add the following to your XML:

<RadioGroup
    ...
    android:checkedButton="@+id/some-radio-button-id">
    ...
</RadioGroup>

Alternatively, you can set the default checked RadioButton in your Activity :

rg.check(R.id.radioButton)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM