一旦我使用方法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);
}
} */
}
}
最好的问候。
答案 0 :(得分:2)
在Game()
中,您点击顶部的i1 > questions.length
,但请尝试靠近底部的q_textview.setText(questions[i1]);
。如果i1 == questions.length
,那将抛出一个ArrayIndexOutOfBoundsException(希望我能正确记住这个名字),将其设为i1 >= questions.length
。此外,您使用i1
作为answers_correct
和answer_list
的索引,这不会超出粘贴的questions
和answers_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
(意外)工作的情况下也使用==
。