提问人:neverEndingQuestion 提问时间:1/19/2021 最后编辑:AlexanderneverEndingQuestion 更新时间:1/19/2021 访问量:115
我的应用从后台回调时显示 ArrayIndexOutOfBoundsException
my app shows ArrayIndexOutOfBoundsException when calling it back from background
问:
我正在尝试编写一个测验应用程序。 一旦我在后台运行我的应用程序,然后再次打开它,我的应用程序就会崩溃。我得到一个 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();
}
}
答:
0赞
Cliff
1/19/2021
#1
以下方法将返回 0-10 范围内的值:
updateQuestion(r.nextInt(mQusetionsLenght));
因此,您必须按以下格式使用它:
updateQuestion(r.nextInt(mQusetionsLenght - 1));
评论
0赞
cactustictacs
1/19/2021
我不认为是这样,从 0(包含)到绑定(排除),所以它已经在做(docs.oracle.com/javase/8/docs/api/java/util/......Random.nextInt(bound)
-1
)
1赞
Cliff
1/19/2021
没错,对不起。
0赞
neverEndingQuestion
1/20/2021
@Cliff我现在使用了这种格式 updateQuestion,它似乎工作得更好一些,但它仍然在同一位置抛出 ArrayIndexOutOfBounds 异常?你能建议另一个解决方案吗?(r.nextInt (mQusetionsLenght - 1));
评论
getChoice2
a
1
0
1
mChoices