0

我正在尝试编写一个测验应用程序。我的应用程序在后台运行后立即崩溃,然后再次打开它。我得到一个 ArrayIndexOutOfBoundsException。不幸的是,尽管我可以在 Logcat 中看到该行,但我看不到错误。我只用问题创建了一个额外的课程。显然错误出现在这里。

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;

    }
}

这是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) 

Logcat 显示这部分代码抛出了 ArrayIndexOutOfBoundsException:

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

但是我找不到错误?我还可以显示我的 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();
    }
}
4

1 回答 1

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));
于 2021-01-18T23:05:53.430 回答