Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException)

loebbel

Mitglied
Hallo liebe Community,
und zwar habe ich folgendes Problem. Ich habe mir ein Buch zum Einstieg in Java besorgt. Eine Aufgabe hieraus lautet nun "Schreiben Sie ein Kalenderprogramm, das Termine für die Jahre 2010 bis 2019 verwaltet. Verwenden Sie hierzu ein vierdimensionales Feld, und berücksichtigen Sie auch Schaltjahre."

Mein Programmcode lautet bisher





Java:
import static Prog1Tools.IOTools.*;

public class Kalender {

	public static void main(String[] args) {
		String[][][][] kalender;

		kalender = new String [10][12][][];
		
		for (int i = 0 ; i < kalender.length ; i++) {
			for (int j = 0; j < kalender[i].length ; j++) {
				switch (j) {
				
				case 0: 
					kalender[i][j] = new String [31][24];
					break;									//Januar
				case 1: 
					if (i == 2 || i == 6) {						//Februar
						kalender[i][j] = new String [29][24];	//
						}										//
						else {									//
						kalender[i][j] = new String [28][24];	//Februar
						}
					break;
				case 2:
					kalender[i][j] = new String [31][24];
					break;									//März
				case 3:
					kalender[i][j] = new String [30][24];
					break;									//April
				case 4:
					kalender[i][j] = new String [31][24];
					break;									//Mai
				case 5:
					kalender[i][j] = new String [30][24];	
					break;									//Juni
				case 6:
					kalender[i][j] = new String [31][24];
					break;									//Juli
				case 7:
					kalender[i][j] = new String [31][24];
					break;									//August
				case 8:
					kalender[i][j] = new String [30][24];
					break;									//September
				case 9:
					kalender[i][j] = new String [31][24];
					break;									//Oktober
				case 10:
					kalender[i][j] = new String [30][24];
					break;									//November
				case 11:
					kalender[i][j] = new String [31][24];
					break;									//Dezember
				default: System.out.println("Error" + j);
					break;
				}
			}
		}
		
		for (int i = 0; i < kalender.length; i++) {
			for (int j = 0; j < kalender[i].length; j++)
				for (int k = 0; k < kalender[i][j].length; k++)
					for (int l = 0; l < kalender[i][j][k].length; l++) 
						kalender[i][j][k][l] = l + ":00 Uhr: " ;
		}
		
		boolean fertig = false;
		while (!fertig) {
		System.out.println("Welche Aktion möchten Sie ausführen? \n 1 = Termin eintragen \n 2 = Termin ausgeben \n 3 = Programm beenden");
		int auswahl = readInteger("Wählen Sie einen gültigen Parameter: ");
		System.out.println();
		
		
		switch (auswahl) {
			case 1: {
				int jahr = 0;
				int monat = 0;
				int tag = 0;
				int zeit = 0;
				boolean gueltig = false;
				while (!gueltig) {
					jahr = readInteger("Welches Jahr? ");
					jahr = jahr - 2000;
					if (jahr < 10 || jahr > 19) {
						System.out.println("Nur gültig für 2010 bis 2019. Versuchen Sie es nochmal!");
					}
					else {
						gueltig = true;
					}
				}
				System.out.println();
				
				gueltig = false;
				while (!gueltig) {
					monat = readInteger("Welcher Monat? ");
					if (monat < 1 || monat > 12) {
						System.out.println("Nur gültig von 1 bis 12");
					}
					else {
						monat -= 1;
						gueltig = true;
					}
						
				}
				
				gueltig = false;
				while (!gueltig) {
					tag = readInteger("Welcher Tag? ");
					if (tag < 1 || tag > kalender[jahr][monat].length) {
						System.out.println("Nur gültig von 1 bis " + kalender[jahr][monat].length + ". Versuchen Sie es erneut!");
					}
					else {
						tag = tag - 1;
						gueltig = true;
					}
				}
				char nochEinTermin = 'j';
				while (nochEinTermin == 'j' || nochEinTermin == 'J') {
				
				gueltig = false;
				while (!gueltig) {
					zeit = readInteger("Welche Uhrzeit? ");
					if (zeit < 0 || zeit > 23)
						System.out.println("Nur gültig von 0 bis 23. Versuchen Sie es erneut!");
					else
						gueltig = true;
						kalender[jahr][monat][tag][zeit] = readString("Welchen Termin möchten Sie eintragen?");
						nochEinTermin = readChar("Möchten Sie an diesem Tag noch ein Termin eintragen? (j/n)");
						while ((nochEinTermin != 'j' && nochEinTermin != 'J') && (nochEinTermin != 'n' && nochEinTermin != 'N'))
							nochEinTermin = readChar("Ungueltige Eingabe! Versuchen Sie es erneut! (j/n)");
				}	
				}
				break;		
			}
			case 2:
			case 3:
			default:
				System.out.println("Falsche Zahl eingegeben! Versuchen Sie es erneut! \n");
		}
		
		}
	}
}

Beim Ausführen des Programmteils 1, also dem Einfügen eines Termins, erhalte ich stets nach der Frage "Welcher Tag?" die Fehlermeldung:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at Kalender.main(Kalender.java:110)

Ich hoffe ihr könnt mir da helfen und danke jetzt schonmal jedem, der mein Programmcode durchforstet 🙂
 
Zuletzt bearbeitet:
Beim Ausführen des Programmteils 1, also dem Einfügen eines Termins, erhalte ich stets nach der Frage "Welcher Tag?" die Fehlermeldung:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at Kalender.main(Kalender.java:110)

Ich hoffe ihr könnt mir da helfen und danke jetzt schonmal jedem, der mein Programmcode durchforstet 🙂

Es wäre uns schon geholfen wenn du uns sagst welche Zeile in dem geposteten Code der Zeile 110 in der Datei Kalendar.java entspricht.

Anmerkung: Bei der 4fach verschachtelten for-Schleife würde ich dir raten bei jeder for-Schleife die Klammern zu setzen! Der Code ist zwar nicht falsch, aber oft wird vergessen das ohne Klammer nur die direkt darauffolgende Anweisung zur Schleife gehört und wird der Code erweitert und man vergisst die Klammern hat man schnell unerklärliche Fehler. Also lieber von Anfang an Klammern als später vergessen und Fehler suchen 😉 (Aber nur ein Tipp und kein Zwang)
 
Anmerkung: Bei der 4fach verschachtelten for-Schleife würde ich dir raten bei jeder for-Schleife die Klammern zu setzen! Der Code ist zwar nicht falsch, aber oft wird vergessen das ohne Klammer nur die direkt darauffolgende Anweisung zur Schleife gehört und wird der Code erweitert und man vergisst die Klammern hat man schnell unerklärliche Fehler. Also lieber von Anfang an Klammern als später vergessen und Fehler suchen 😉 (Aber nur ein Tipp und kein Zwang)

Vielen Dank für den Hinweis, werde ihn beherzigen 🙂
Zu meinem Problem, nachdem ich es für gestern habe sein lassen und mich heute erst wieder rangesetzt habe, ist mir aufgefallen, dass das Problem in der Zeile 85. lag, in der ich dass einzulesende Jahr auf die Einträge des Arrays anpassen wollte. Denn an dieser Stelle wurde immer nur 2000 subtrahiert, sodass die eingelesene Zahl, die mindestens 2010 betrug, immer den Rahmen des Arrays von 0-9 überschritten hat. Das habe ich nun behoben und das Programm läuft einwandfrei.
Trotzdem vielen Dank für Ihre Hilfe und den Hinweis 🙂
 
Zuletzt bearbeitet:

Zurück
Oben