奇怪的错误+如何使这个代码更有效?

时间:2011-11-14 00:05:14

标签: java android

一旦我使用方法Game(),我的应用程序崩溃了,为什么? 此外,我想知道是否可以使我的代码在空间方面更短,并且更好。

代码:

package com.aleksei.etb;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;

public class ETBetaActivity extends Activity implements View.OnClickListener {

    Button answer_1,
    answer_2,answer_3,
    answer_4,main;

    TextView q_textview,
    TextView tip;

    private String aString[];

    private int i1 = 0;
    private int correct = 0;

    private boolean alive = false;

    MediaPlayer button_click;

    private String[] questions ={"Question 1" , "Question 2","Question 5"};
    private String[] answers_correct ={"Correct answer 1", "Correct answer 2","Correct answer 3","Correct answer 4","Correct answer 5"};

    List<String> question_list = new ArrayList<String>();
    List<String> answer_list_correct = new ArrayList<String>();


    @Override
    public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            getData();
    }

    @Override
    public void onClick(View view) {

        button_click = MediaPlayer.create(this, R.raw.button_click);
        button_click.start();
        switch(view.getId()){

           case R.id.button5: //main
                             if(!alive)
                             alive = true;
                             break;
           case R.id.button1: //answer_1
                             if(alive == false)
                               return;
                             if(correct(1))
                               correct++;           
                             break;
           case R.id.button2: //answer_2
                             if(alive == false)
                               return;
                             if(correct(2))
                               correct++;
                             break;
           case R.id.button3: //answer_3
                             if(alive == false)
                               return;
                             if(correct(3))
                               correct++;           
                             break;
           case R.id.button4: //answer_3
                             if(alive == false)
                               return;
                             if(correct(4))
                               correct++;
                             break;
               default:
                             break;     
           }
           Game();      
    }

    private boolean correct(int button){

       try {
            for (int i = 0; i < answers_correct.length; i++){
                 if(button == 1 && aString[0] == answers_correct[i]
            || button == 2 && aString[1] == answers_correct[i]
            || button == 3 && aString[2] == answers_correct[i]
            || button == 4 && aString[3] == answers_correct[i])
                        return true;
            }
       } 
       catch(Exception ex){
            System.out.println(ex);
       }
       return false;
    }

    private void Game(){

        if(i1 > questions.length) //no more questions
            return;
        main.setText("Next");
            try {
                    String answer_list[][] = {
                               {answers_correct[i1], "Answer 1-2" , "Answer 1-3" , "Answer 1-4"},
                               {answers_correct[i1], "Answer 2-2" , "Answer 2-3" , "Answer 2-4"},
                               {answers_correct[i1], "Answer 3-2" , "Answer 3-3" , "Answer 3-4"},
                               {answers_correct[i1], "Answer 4-2" , "Answer 4-3" , "Answer 4-4"},
                               {answers_correct[i1], "Answer 5-2" , "Answer 5-3" , "Answer 5-4"}};

                    Collections.shuffle(Arrays.asList(answer_list[i1]));
                    answer_1.setText(answer_list[i1][0]);
                    answer_2.setText(answer_list[i1][1]);
                    answer_3.setText(answer_list[i1][2]);
                    answer_4.setText(answer_list[i1][3]);
                    aString[0] = answer_list[i1][0];
                    aString[1] = answer_list[i1][1];
                    aString[2] = answer_list[i1][2];
                    aString[3] = answer_list[i1][3];
                    q_textview.setText(questions[i1]);
          } 
          catch(Exception e){
            System.out.println(e);
          }
          tip.setText(correct);

        /*questions = question_list.toArray(new String[question_list.size()]);
         answers_correct = answer_list_correct.toArray(new                  String[answer_list_correct.size()]);

        question.setText(questions[i1]);        

        answer_list_correct.remove(questions[i1]);
        question_list.remove(questions[i1]);*/
         i1++;
    }
    private void getData(){
        //Getting the data
        main = (Button) findViewById(R.id.button5);
        answer_1 = (Button) findViewById(R.id.button1);
        answer_2 = (Button) findViewById(R.id.button2);
        answer_3 = (Button) findViewById(R.id.button3);
        answer_4 = (Button) findViewById(R.id.button4);
        q_textview = (TextView) findViewById(R.id.question);
        tip = (TextView) findViewById(R.id.answ1);

        //Making the buttons, actually work
        main.setOnClickListener(this);
        answer_1.setOnClickListener(this);
        answer_2.setOnClickListener(this);
        answer_3.setOnClickListener(this);
        answer_4.setOnClickListener(this);

            //Resets the text
            //Note to self: Replace with another ContectView
        main.setText("Begin!");
        answer_4.setText("");
        answer_3.setText("");
        answer_2.setText("");
        answer_1.setText("");

    /*  for(String x : questions) {
            for(String y : answers_correct){

            answer_list_correct.add(y);
            question_list.add(x);

            Collections.shuffle(answer_list_correct);
            Collections.shuffle(question_list);

            }
        } */
    }
}

最好的问候。

1 个答案:

答案 0 :(得分:2)

Game()中,您点击顶部的i1 > questions.length,但请尝试靠近底部的q_textview.setText(questions[i1]);。如果i1 == questions.length,那将抛出一个ArrayIndexOutOfBoundsException(希望我能正确记住这个名字),将其设为i1 >= questions.length。此外,您使用i1作为answers_correctanswer_list的索引,这不会超出粘贴的questionsanswers_correct的范围,但可能是对于真实的(不太可能,你不会有更多的问题而不是答案,对吗?)。

correct中,您的if声明

if(button == 1 && aString[0] == answers_correct[i]
    || button == 2 && aString[1] == answers_correct[i]
    || button == 3 && aString[2] == answers_correct[i]
    || button == 4 && aString[3] == answers_correct[i])
    return true;

可以缩短为

if (aString[button-1] == answers_correct[i]) return true;

(除非按钮的值为&lt; 1或&gt; 4,否则您还需要检查button >= 1 && button <= 4)。但是,使用==来比较字符串是危险的,几乎肯定是错误的。 ==比较引用的相等性,因此string1 == string2仅在两者都引用相同的String实例时才为真。如果在所有情况下,你的所有字符串都来自源代码中的字符串文字,它会起作用,因为每个文字只有一个实例,但如果外面的字符串可以进入游戏,你必须使用equals来比较字符串。在equals(意外)工作的情况下也使用==