Android App崩溃:致命异常:主要

时间:2013-10-21 12:29:54

标签: java android exception crash

我编写了Android QuizApp,它随机为用户生成问题,然后显示结果。当我尝试实现用户输入问题的数量和难度的用户界面时,应用程序开始崩溃并给我致命的例外。我有4个班级:

package com.example.quizapp;

import java.util.Random;
public class Quiz {
private int difficulty;
private int numberOfQuestions;
private Question[] questions;

public Quiz(String difficulty, int numberOfQuestions) {
    setDifficulty(difficulty);
    this.numberOfQuestions = numberOfQuestions;
    this.questions = new Question[this.numberOfQuestions];
    for (int i = 0; i < this.numberOfQuestions; i++) {
        this.questions[i] = new Question(this.difficulty);
    }

}

public void setDifficulty(String difficulty) {
   if (difficulty ==  "easy") {
            this.difficulty = 1;
   } else  if (difficulty ==  "medium"){
            this.difficulty = 2;
   } else  if (difficulty ==  "hard"){
       this.difficulty = 3;
   } else {
       this.difficulty = -1;
   }
}

public String getDifficulty() {
    switch (difficulty) {
        case 1:
            return "easy";
        case 2:
            return "medium";
        case 3:
            return "hard";
        default:
            return "Difficulty not set correctly";
    }
}

public Question getQuestionInstance(int number) {
    return this.questions[number];
}
public String getQuestion(int number) {
    return this.questions[number].QUESTION;
}

public int getOptionA(int number) {
    return this.questions[number].OPTA;
}

public int getOptionB(int number) {
    return this.questions[number].OPTB;
}

public int getOptionC(int number) {
    return this.questions[number].OPTC;
}

public int getAnswer(int number) {
    return this.questions[number].ANSWER;
}

class Question {

    private int firstNumber;
    private int secondNumber;
    private char sign;
    private String QUESTION;
    private int OPTA;
    private int OPTB;
    private int OPTC;
    private int ANSWER;
    private int difficulty;
    private Random rand;

    public Question(int difficulty) {
        this.difficulty = difficulty;
        this.rand = new Random();
        this.firstNumber = getRandomNumber();
        this.secondNumber = getRandomNumber();
        this.sign = getRandomSign();
        this.ANSWER = calculateAnswer();
        initializeOptions();
        this.QUESTION = this.firstNumber + " " + this.sign + " " + this.secondNumber + " = ";
    }

    public String getQuestion() {
        return this.QUESTION;
    }

    public int getOptionA() {
        return this.OPTA;
    }

    public int getOptionB() {
        return this.OPTB;
    }

    public int getOptionC() {
        return this.OPTC;
    }

    public int getAnswer() {
        return this.ANSWER;
    }

    private void initializeOptions() {
        int number = this.rand.nextInt(3) + 1;

        switch (number) {
            case 1:
                this.OPTA = this.ANSWER;
                this.OPTB = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTC = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                break;
            case 2:
                this.OPTA = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTB = this.ANSWER;
                this.OPTC = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                break;
            case 3:
                this.OPTA = (int) Math.floor(this.ANSWER - this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTB = (int) Math.floor(this.ANSWER + this.ANSWER / 100.0 * (this.rand.nextInt(81) + 20));
                this.OPTC = this.ANSWER;
                break;
        }

    }

    private int calculateAnswer() {
        int answer = 0;
        switch (this.sign) {
            case '+':
                answer = this.firstNumber + this.secondNumber;
                break;
            case '-':
                answer = this.firstNumber - this.secondNumber;
                break;
            case '*':
                answer = this.firstNumber * this.secondNumber;
                break;
            case '/':
                answer = this.firstNumber / this.secondNumber;
                break;
        }

        return answer;
    }

    private int getRandomNumber() {
        int number;
        if (this.difficulty == 1) {
            //number = 1 +  Math.random()*100;
            number = this.rand.nextInt(100) + 1;
        } else if (this.difficulty == 2) {
            //number = 1 +  Math.random()*1000;
            number = this.rand.nextInt(1000) + 1;
        } else {
            //number = 1 +  Math.random()*1000;
            number = this.rand.nextInt(1000) + 1;
        }
        return number;
    }

    private char getRandomSign() {
        int number;
        char sign;
        //easy
        if (this.difficulty == 1) {
            number = this.rand.nextInt(2) + 1;
            sign = convertNumberToSign(number);
            //medium
        } else if (this.difficulty == 2) {
            if (this.firstNumber > 10 && this.secondNumber > 10) {
                number = this.rand.nextInt(2) + 1;
                sign = convertNumberToSign(number);
            } else {
                number = this.rand.nextInt(3) + 1;
                sign = convertNumberToSign(number);
            }
            //hard
        } else {
            if (this.firstNumber / this.secondNumber == (int) (this.firstNumber / this.secondNumber)) {
                number = this.rand.nextInt(4) + 1;
                sign = convertNumberToSign(number);
            } else {
                number = this.rand.nextInt(3) + 1;
                sign = convertNumberToSign(number);
            }
        }
        return sign;
    }

    private char convertNumberToSign(int number) {
        if (number == 1) {
            return '+';
        } else if (number == 2) {
            return '-';
        } else if (number == 3) {
            return '*';
        } else {
            return '/';
        }
    }

}

}

package com.example.quizapp;

import com.example.quizapp.R;

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

public class QuizActivity extends Activity 
{
Quiz quiz;
RadioButton rb1, rb2, rb3, rb4, rb5, rb6;
Button buttonOK;
String ans;
int num = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ui);
    rb1=(RadioButton)findViewById(R.id.radio3);
    rb2=(RadioButton)findViewById(R.id.radio4);
    rb3=(RadioButton)findViewById(R.id.radio5);
    rb4=(RadioButton)findViewById(R.id.radio6);
    rb5=(RadioButton)findViewById(R.id.radio7);
    rb6=(RadioButton)findViewById(R.id.radio8);

    buttonOK=(Button)findViewById(R.id.button2);        
    buttonOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RadioGroup group2=(RadioGroup)findViewById(R.id.radioGroup3);
            RadioButton answer2=(RadioButton)findViewById(group2.getCheckedRadioButtonId());
            if (answer2.equals(rb4))
            {
                num = 5;
            }
            else if (answer2.equals(rb5))
            {
                num = 10;
            }
            else
            {
                num = 15;
            }

            RadioGroup group1=(RadioGroup)findViewById(R.id.radioGroup2);
            RadioButton answer1=(RadioButton)findViewById(group1.getCheckedRadioButtonId());
            if (answer1.equals(rb1))
            {
                ans = "easy";
            }
            else if (answer1.equals(rb2))
            {
                ans = "medium";
            }
            else
            {
                ans = "hard";
            }


        }
    });

    Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
            intent.putExtra("answer", ans);
            intent.putExtra("question", num);
            QuizActivity.this.startActivity(intent);
            finish();


}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_ui, menu);
    return true;
}
}

package com.example.quizapp;

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

public class QuestActivity extends Activity
{
Quiz quiz;
int score = 0;
int qid = 0;
Quiz.Question currentQuest;
TextView textQuestion;
RadioButton rba, rbb, rbc;
Button buttonNext;
    String answer = null;
    int numOfQuestion = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
    Intent intent= getIntent();
    if (intent != null)
    {
answer=intent.getStringExtra("answer");
numOfQuestion=intent.getIntExtra("question", 0);
    }


    quiz= new Quiz(answer,numOfQuestion);
currentQuest=quiz.getQuestionInstance(qid);
textQuestion=(TextView)findViewById(R.id.textView1);
rba=(RadioButton)findViewById(R.id.radio0);
rbb=(RadioButton)findViewById(R.id.radio1);
rbc=(RadioButton)findViewById(R.id.radio2);
buttonNext=(Button)findViewById(R.id.button1);
setQuestionView();

buttonNext.setOnClickListener(new View.OnClickListener() 
{       
    @Override
    public void onClick(View v) 
    {
        RadioGroup group=(RadioGroup)findViewById(R.id.radioGroup1);
        RadioButton answer=(RadioButton)findViewById(group.getCheckedRadioButtonId());
        Log.d("yourans", currentQuest.getAnswer() + " " + answer.getText());
           if(Integer.toString(currentQuest.getAnswer()).equals(answer.getText()) )
        {
            score++;
            Log.d("score", "Your score" + score);
        }
        if(qid<numOfQuestion)
        {                   
            currentQuest=quiz.getQuestionInstance(qid);
            setQuestionView();
        }else
        {
            Intent intent = new Intent(QuestActivity.this, ResultActivity.class);
            Bundle b = new Bundle();
            b.putInt("score", score);
            intent.putExtras(b);
            startActivity(intent);
            finish();
        }
    }
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_quiz, menu);
return true;
}



private void setQuestionView()
{
   textQuestion.setText(currentQuest.getQuestion());
   rba.setText(Integer.toString(currentQuest.getOptionA()));
   rbb.setText(Integer.toString(currentQuest.getOptionB()));
   rbc.setText(Integer.toString(currentQuest.getOptionC()));
qid++;
}
}

package com.example.quizapp;
import com.example.quizapp.R;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.RatingBar;
import android.widget.TextView;

public class ResultActivity extends Activity 
{
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);
    //access rating bar
    RatingBar rbar=(RatingBar)findViewById(R.id.ratingBar1); 
        rbar.setNumStars(5);
    rbar.setStepSize(0.5f);
        TextView t=(TextView)findViewById(R.id.textResult);
        //get and display the score
    Bundle b = getIntent().getExtras();
        int score= b.getInt("score");
        rbar.setRating(score);

        switch (score)
        {
    case 1:
        case 2: t.setText("Better Luck Next Time!");
        break;
    case 3:
    case 4:t.setText("Quite average");
    break;
    case 5:t.setText("Congratulations !");
    break;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.activity_result, menu);
    return true;
}
}

编辑:我添加了AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.quizapp"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.quizapp.QuizActivity"
        android:label="@string/quiz_app" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.quizapp.QuestActivity"
        android:label="@string/title_activity_quiz" >
    </activity>
    <activity
        android:name="com.example.quizapp.ResultActivity"
        android:label="@string/title_activity_result" >
    </activity>
</application>

</manifest>

已编辑:已按建议更新了应用程序,此错误会弹出,应用程序崩溃:

10-23 10:10:32.368: E/AndroidRuntime(827): FATAL EXCEPTION: main
10-23 10:10:32.368: E/AndroidRuntime(827): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quizapp/com.example.quizapp.QuestActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-23 10:10:32.368: E/AndroidRuntime(827):  at    android.os.Handler.dispatchMessage(Handler.java:99)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.os.Looper.loop(Looper.java:137)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-23 10:10:32.368: E/AndroidRuntime(827):  at java.lang.reflect.Method.invokeNative(Native Method)
10-23 10:10:32.368: E/AndroidRuntime(827):  at java.lang.reflect.Method.invoke(Method.java:525)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-23 10:10:32.368: E/AndroidRuntime(827):  at dalvik.system.NativeStart.main(Native Method)
10-23 10:10:32.368: E/AndroidRuntime(827): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.example.quizapp.Quiz.getQuestionInstance(Quiz.java:45)
10-23 10:10:32.368: E/AndroidRuntime(827):  at com.example.quizapp.QuestActivity.onCreate(QuestActivity.java:52)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.Activity.performCreate(Activity.java:5133)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-23 10:10:32.368: E/AndroidRuntime(827):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-23 10:10:32.368: E/AndroidRuntime(827):  ... 11 more

3 个答案:

答案 0 :(得分:3)

在清单中查看:

  

机器人:名称= “com.example.quizapp.QuizApp”

你有这个活动“QuizApp”吗?

将清单更改为:

android:name="com.example.quizapp.QuizActivity"

HTH。

答案 1 :(得分:2)

你告诉Android你有一个名为Activity的{​​{1}}作为QuizApp,说

Main Activity

但你从未实现过它。 Android会在程序包 <activity android:name="com.example.quizapp.QuizApp" android:label="@string/quiz_app" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 中查找该活动,但无法查找该活动,我们可以从LogCat消息中的com.example.quizapp看到,

ClassNotFoundException

您必须实施QuizApp 10-21 06:31:26.907: E/AndroidRuntime(816): ... java.lang.ClassNotFoundException: Didn't find class "com.example.quizapp.QuizApp"...

答案 2 :(得分:0)

看起来Manifest文件中包名称不匹配错误。将其更正为

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.quizapp"
   ...
</manifest>

不要忘记,您可以为每个活动指定完全限定名称 即。

           <activity
            android:name="com.example.quizapp.Activity_name"
            ...>
            </activity>

根据要求编辑

package com.example.quizapp;

import com.example.quizapp.R;

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

public class QuizActivity extends Activity 
{
Quiz quiz;
RadioButton rb1, rb2, rb3, rb4, rb5, rb6;
Button buttonOK;
String ans;
int num = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ui);
    rb1=(RadioButton)findViewById(R.id.radio3);
    rb2=(RadioButton)findViewById(R.id.radio4);
    rb3=(RadioButton)findViewById(R.id.radio5);
    rb4=(RadioButton)findViewById(R.id.radio6);
    rb5=(RadioButton)findViewById(R.id.radio7);
    rb6=(RadioButton)findViewById(R.id.radio8);

    buttonOK=(Button)findViewById(R.id.button2);        
    buttonOK.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            RadioGroup group2=(RadioGroup)findViewById(R.id.radioGroup3);
            RadioButton answer2=(RadioButton)findViewById(group2.getCheckedRadioButtonId());
            if (answer2.equals(rb4))
            {
                num = 5;
            }
            else if (answer2.equals(rb5))
            {
                num = 10;
            }
            else
            {
                num = 15;
            }

            RadioGroup group1=(RadioGroup)findViewById(R.id.radioGroup2);
            RadioButton answer1=(RadioButton)findViewById(group1.getCheckedRadioButtonId());
            if (answer1.equals(rb1))
            {
                ans = "easy";
            }
            else if (answer1.equals(rb2))
            {
                ans = "medium";
            }
            else
            {
                ans = "hard";
            }


        }
    });

    //*********Edit

    //Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
    //QuizActivity.this.startActivity(intent);
    //finish();

    Intent intent = new Intent(QuizActivity.this, QuestActivity.class);
    intent.putExtra("answer", ans);
    intent.putExtra("question", num);
    QuizActivity.this.startActivity(intent);
    finish();

    //*******Edit

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_ui, menu);
    return true;
}
}

此处下一个活动

package com.example.quizapp;

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

public class QuestActivity extends Activity
{
Quiz quiz;
int score = 0;
int qid = 0;
Quiz.Question currentQuest;
TextView textQuestion;
RadioButton rba, rbb, rbc;
Button buttonNext;

QuizActivity qa = new QuizActivity();
String ans = qa.ans;
int num = qa.num;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);

//*********Edit

Intent intent= getActivity().getIntent();
String answer=intent.getStringExtra("answer");
int numOfQuestion=intent.getIntExtra("question", 0);

//quiz= new Quiz(ans, num);

quiz= new Quiz(answer,numOfQuestion);

//*******

currentQuest=quiz.getQuestionInstance(qid);
textQuestion=(TextView)findViewById(R.id.textView1);
rba=(RadioButton)findViewById(R.id.radio0);
rbb=(RadioButton)findViewById(R.id.radio1);
rbc=(RadioButton)findViewById(R.id.radio2);
buttonNext=(Button)findViewById(R.id.button1);
setQuestionView();

buttonNext.setOnClickListener(new View.OnClickListener() 
{       
    @Override
    public void onClick(View v) 
    {
        RadioGroup group=(RadioGroup)findViewById(R.id.radioGroup1);
        RadioButton answer=(RadioButton)findViewById(group.getCheckedRadioButtonId());
        Log.d("yourans", currentQuest.getAnswer() + " " + answer.getText());
           if(Integer.toString(currentQuest.getAnswer()).equals(answer.getText()) )
        {
            score++;
            Log.d("score", "Your score" + score);
        }
        if(qid<num)
        {                   
            currentQuest=quiz.getQuestionInstance(qid);
            setQuestionView();
        }else
        {
            Intent intent = new Intent(QuestActivity.this, ResultActivity.class);
            Bundle b = new Bundle();
            b.putInt("score", score);
            intent.putExtras(b);
            startActivity(intent);
            finish();
        }
    }
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_quiz, menu);
return true;
}



private void setQuestionView()
{
   textQuestion.setText(currentQuest.getQuestion());
   rba.setText(Integer.toString(currentQuest.getOptionA()));
   rbb.setText(Integer.toString(currentQuest.getOptionB()));
   rbc.setText(Integer.toString(currentQuest.getOptionC()));
qid++;
}
}