0

I'm trying to program a quiz app. My app crashes as soon as I run it in the background and then open it again. I get an ArrayIndexOutOfBoundsException. Unfortunately I cannot see the error although I can see the line in the Logcat. I created an extra class with just the questions. Apparently the bug appears here.

public class Fragen {

    public String[] mQuestions ={
            "Womit beschäftigt sich die Logistik?",//1
            "Wie viele Betriebsversammlungen vom Betriebsrat sind gesetzlich pro Jahr festgelegt?",//2
            "Nenne die Kernelemente, die zur Anwendung in der Logistik notwendig sind", //3
            "Was versteht man unter der externen Logistik?", //4
            "Was versteht man unter der internen Logistik?", //5
            "Ein Großunternehmen-Zulieferer fertigt Vorleistungen in Asien für einen in Deutschland liegenden Automobilhersteller, welche Nachteile könnten hierbei entstehen?", //6
            "Herr Meier ist in der Beschaffung von Gütern tätig und hat sich gefragt ob per Telefon Verträge zustande kommen können oder ob diese immer schriftlich erfolgen müssen?",//7
            "Frau Petersen, die bei einem deiner Lieferanten (Stark-Schrauben AG) im Verkauf arbeitet macht dir ein schriftliches Angebot von 2000 Schrauben. Diese erfüllen allerdings nicht deinen Kriterien und du reagierst auch nicht auf dieses Angebot. Ist hierbei ein Vertrag zustande gekommen?",//8
            "Die Beschaffungsstrategien zeichnen viele Merkmale aus, nenne drei davon",//9
            "Aufgrund nicht erlaubter Wettbewerbsabsprachen hat das Bundeskartellamt gegen drei Großhändler und mehreren Verantwortlichen Bußgelder von insgesamt 3 Millionen Euro verhängt. Der Gesetzgeber regelt in den Bestimmungen, ob und wann Unternehmenszusammenschlüsse zulässig sind. Nenne zwei Nachteile für die Volkswirtschaft, die aus Unternehmenszusammenschlüsse entstehen?"//10

    };

    private String mChoices [] [] ={

            {"Bestimmte Güter in der bestimmten Menge sowie Qualität zur Verfügung zu stellen","Das Programmieren bestimmter Software","Das aussortieren von Verpackungen","Die Montage von Betriebsmaschinen"},//1
            {"2","5","4","1"},//2
            {"Einkauf, Kundenbetreuung","Risikomanagement, Bilanzierung","Planung, Koordination","Montage, Beratung"}, //3
            {"Umstellungen innerhalb des Unternehmens","Der Weg vom Lieferanten zum Unternehmen, anschließend zum Kunden","Mitarbeiterbeschaffung","Umlagerung von Gütern in Fremdfirmen"}, //4
            {"Austausch von Gütern innerhalb betrieblicher Bereiche","Gütertransport zum Kunden","Qualitätskontrollen","Kundengewinnung"}, //5
            {"Höhere kosten","schwierige Kommunikation, da kein Englisch gesprochen wird","Keine Reklamationen möglich","Fehlende Flexibilität und Umweltbelastung aufgrund der Entfernung"},//6
            {"Verträge müssen immer schriftlich erfolgen","Dies ist nur teilweise möglich, nach dem Telefonat muss Herr Meier eine kurze Email des Antrags schreiben","Ja, es genügt eine Willenserklärung abzugeben z.B. am Telefon","Verträge können nur mündlich abgegeben werden"},//7
            {"Gemäß §147 Abs.2 BGB muss die Annahme in diesem Fall schriftlich erfolgen, ein Vertrag ist nicht zustande gekommen","Ja, du hättest innerhalb der Widerrufsfrist reagieren müssen","Ja ein Vertrag ist zustande gekommen, allerdings hat man ein Recht auf Preissenkung","Ja, laut §15 Abs.9 BGB ist hier ein bindender Vertrag zustande gekommen"},//8
            {"Billige Arbeitskräfte finden, Softwarebeschaffung, Organisation der Betriebsmittel","Einkaufspreise reduzieren, neue Lieferanten suchen, Abhängigkeit reduzieren durch Puffer","so viele Lieferanten wie möglich finden, Lieferantenketten pflegen, Arbeitsmittel in regelmäßigen Abständen erneuern","Betriebsmittel zur verfügung stellen, Lagerbestände immer auslaufen lassen, möglichst wenig Kapital bei der Beschaffung verwenden"},//9
            {"Gefahr für überhöhte Preise, Die Vielfalt des Güterangebotes verringt sich","Die Preise fallen stark, Arbeitsplätze sind in Gefahr","Es werden keine Handelsabkommen mehr geschlossen, Zollgebühren steigen enorm an","Eine Inflation könnte herbeigerufen werden, Die Wirtschaft erlebt ein ständiges auf und ab"}//10
            
    };

    private String mCorrectAnswers [] = {
            "Bestimmte Güter in der bestimmten Menge sowie Qualität zur Verfügung zu stellen",//1
            "4", //2
            "Planung, Koordination",//3
            "Vom Lieferanten zum Unternehmen, anschließend zum Kunden", //4
            "Austausch von Gütern innerhalb betrieblicher Bereiche", //5
            "Fehlende Flexibilität und Umweltbelastung aufgrund der Entfernung", //6
            "Ja, es genügt eine Willenserklärung abzugeben z.B. am Telefon",//7
            "Gemäß §147 Abs.2 BGB muss die Annahme in diesem Fall schriftlich erfolgen, ein Vertrag ist nicht zustande gekommen",//8
            "Einkaufspreise reduzieren, neue Lieferanten suchen, Abhängigkeit reduzieren durch Puffer",//9
            "Gefahr für überhöhte Preise, Die Vielfalt des Güterangebotes verringt sich" //10
           } ;

    public String getQuestions (int a){
        String question = mQuestions[a];

        return question;
    }

    public String getChoice1 (int a) {
        String choice = mChoices [a][0];
        return  choice;

    }
    public String getChoice2 (int a) {
        String choice = mChoices [a][1];
        return  choice;

    }
    public String getChoice3 (int a) {
        String choice = mChoices [a][2];
        return  choice;

    }
    public String getChoice4 (int a) {
        String choice = mChoices [a][3];
        return  choice;

    }
    public String getCorrechtAnswer (int a){
            String answer = mCorrectAnswers [a];
            return answer;

    }
}

And this is the Logcat

2021-01-18 19:45:50.060 23813-23813/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.logistikmeisterprfungsvorbereitung, PID: 23813
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.logistikmeisterprfungsvorbereitung/com.example.logistikmeisterprfungsvorbereitung.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3308)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3457)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7562)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
    at com.example.logistikmeisterprfungsvorbereitung.Fragen.getChoice2(Fragen.java:493)
    at com.example.logistikmeisterprfungsvorbereitung.MainActivity.updateQuestion(MainActivity.java:154)
    at com.example.logistikmeisterprfungsvorbereitung.MainActivity.onCreate(MainActivity.java:65)
    at android.app.Activity.performCreate(Activity.java:7893)
    at android.app.Activity.performCreate(Activity.java:7880)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3283)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3457) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:7562) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

The Logcat shows that this part of the code throws the ArrayIndexOutOfBoundsException:

public String getChoice2 (int a) {
    String choice = mChoices [a][1];
    return  choice;
}

But i can't find the bug ? I can also show my MainActivity.java


public class MainActivity extends AppCompatActivity {

    Button antwort1,antwort2,antwort3,antwort4,hauptmenu;
    TextView frage;
    TextView punkte;
    ImageView coin;
    Animation rotateanimation;

    private Fragen mQuestions = new Fragen();
    private String mAnswers;
    private int mScore = 0;
    private int mQusetionsLenght = mQuestions.mQuestions.length;
    MediaPlayer richtig_sound, falschsound;
    AlertDialog alertDialogBuilder;
    Random r;

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

        hauptmenu = (Button)findViewById(R.id.hauptmenu);
        hauptmenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent_hauptmenu = new Intent(getApplicationContext(), Begrusung.class);
                startActivity(intent_hauptmenu);
                finish();
            }
        });


        r = new Random();
        richtig_sound = MediaPlayer.create(this,R.raw.richtig_sound);
        falschsound = MediaPlayer.create(this, R.raw.falsch_sound);
        

        antwort1 = (Button)findViewById(R.id.antwort1);
        antwort2 = (Button)findViewById(R.id.antwort2);
        antwort3 = (Button)findViewById(R.id.antwort3);
        antwort4 = (Button)findViewById(R.id.antwort4);

        frage = (TextView)findViewById(R.id.frage);
        punkte = (TextView)findViewById(R.id.punkte);
        punkte.setText("Punkte: " + mScore);
        updateQuestion(r.nextInt(mQusetionsLenght));

        coin = (ImageView)findViewById(R.id.coin);


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

                if (antwort1.getText() == mAnswers){
                    mScore ++;
                    richtig_sound.start();
                    rotateanimationMethode ();

                    punkte.setText("Punkte: " + mScore);
                    updateQuestion(r.nextInt(mQusetionsLenght));

                }else {
                    falschsound.start();
                   
                    custom_alert();
                }
            }
        });

        antwort2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (antwort2.getText() == mAnswers){
                    mScore ++;
                    richtig_sound.start();
                    rotateanimationMethode ();

                    punkte.setText("Punkte: " + mScore);
                    updateQuestion(r.nextInt(mQusetionsLenght));

                }else {
                    falschsound.start();
                    
                    custom_alert();
                }
            }
        });

        antwort3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (antwort3.getText() == mAnswers){
                    mScore ++;
                    richtig_sound.start();
                    rotateanimationMethode ();

                    punkte.setText("Punkte: " + mScore);
                    updateQuestion(r.nextInt(mQusetionsLenght));

                }else {
                    falschsound.start();
                    custom_alert();
                }
            }
        });

        antwort4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (antwort4.getText() == mAnswers){
                    mScore ++;
                    richtig_sound.start();
                    rotateanimationMethode ();

                    punkte.setText("Punkte: " + mScore);
                    updateQuestion(r.nextInt(mQusetionsLenght));

                }else {
                    falschsound.start();
                    custom_alert();
                }
            }
        });


    }

    private void updateQuestion (int num){
        frage.setText(mQuestions.getQuestions(num));
        antwort1.setText(mQuestions.getChoice1(num));
        antwort2.setText(mQuestions.getChoice2(num));
        antwort3.setText(mQuestions.getChoice3(num));
        antwort4.setText(mQuestions.getChoice4(num));

        mAnswers = mQuestions.getCorrechtAnswer(num);
    }



    private void custom_alert () {

        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.custom_alert_dialog, null);
        Button neues_spiel = view.findViewById(R.id.neues_spiel);
        Button beenden = view.findViewById(R.id.beenden);
        TextView alert_text = view.findViewById(R.id.alerttext);
        alert_text.setText("Das Spiel ist zu Ende, deine Punktzahl: " + mScore +"\n" + "Die richtige Antwort war:" +"\n"+"\n"+ mAnswers + "\n" + "\n"+ "Du kannst bei der letzten Frage weitermachen, indem du außerhalb dieser Box an irgendeiner Stelle klickst");
        neues_spiel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(),MainActivity.class));
            }
        });
        beenden.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent2 = new Intent(getApplicationContext(),Begrusung.class );
                startActivity(intent2);

                finish();

            }
        });

        alertDialogBuilder = new AlertDialog.Builder(MainActivity.this).setView(view)
                .create();
        alertDialogBuilder.show();

    }

    private void rotateanimationMethode () {

        rotateanimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
        coin.startAnimation(rotateanimation);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (alertDialogBuilder!=null && alertDialogBuilder.isShowing() ){
            alertDialogBuilder.cancel();}
    }

    @Override
    protected void onStop() {
        super.onStop();
        richtig_sound.stop();
        richtig_sound.release();
        falschsound.stop();
        falschsound.release();
    }
}
Alexander
  • 2,925
  • 3
  • 33
  • 36
  • You're best bet is to do some simple debugging. My guess is that the parameter you're passing into `getChoice2` is incorrect or invalid. Either run a debugger or use a toast or print that parameter `a` to console. That's going to tell you where to start looking. Gruesse. – MarsAtomic Jan 18 '21 at 20:28
  • The crash is literally that you have an array of length ``1``, which means its maximum index is ``0``, but you're accessing index ``1``. It looks fine in your example (your ``mChoices`` array has more than 1 element, and so does each of the arrays it contains) but you said you "created an extra class with the questions" for your example - so maybe the original is broken? – cactustictacs Jan 18 '21 at 23:09

1 Answers1

0

The following method will return values in range of 0-10 :

updateQuestion(r.nextInt(mQusetionsLenght));

So you have to use it with the following format:

updateQuestion(r.nextInt(mQusetionsLenght - 1));
Cliff
  • 682
  • 8
  • 30
  • I don't think it's that, ``Random.nextInt(bound)`` goes from 0 (inclusive) to bound (exclusive), so it's already doing the ``-1`` (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-) – cactustictacs Jan 18 '21 at 23:15
  • 1
    Correct, my bad sorry. – Cliff Jan 19 '21 at 07:05
  • @Cliff I have now used this format updateQuestion `(r.nextInt (mQusetionsLenght - 1));` it seems to work a little better, but it still throws an ArrayIndexOutOfBounds exception at the same place? Can you suggest another solution? – neverEndingQuestion Jan 19 '21 at 19:04