as soon as I use method Game(), my app crashes, why?
Also I’d like to know if it’s possible to make my code shorter in terms of space it takes & better.
Code:
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);
}
} */
}
}
Best regards.
In
Game(), you checki1 > questions.lengthat the top, but tryq_textview.setText(questions[i1]);near the bottom. Ifi1 == questions.length, that would throw an ArrayIndexOutOfBoundsException (hope I remembered the name correctly), make iti1 >= questions.length. Also, you usei1as index foranswers_correctandanswer_list, that won’t be out of bounds for the pastedquestionsandanswers_correct, but might be for the real (unlikely, though, you won’t have more questions than answers, would you?).In
correct, yourifstatementcould be shortened to
(unless button can have values < 1 or > 4, then you would need to check for
button >= 1 && button <= 4too). However, using==to compare Strings is dangerous and almost certainly wrong.==compares the equality of references, sostring1 == string2is true only if both refer to the same String instance. If, as seems to be the case, all your Strings come from string literals in the source code, it will kind of work because then there is only one instance for each literal, but if outside Strings could enter the game, you must useequalsto compare Strings. Useequalsalso in those cases where==would (sort of accidentally) work.