Variable speichert nicht die korrekte Zahl ein

GreenTeaYT

Mitglied
Hey Leute ich hab da ein Problem was ich nicht beheben kann. Also das Programm fragt nach einer Monatszahl von 1- 12. Bei kleinere Zahlen wie -1,-2 oder größeren Zahlen wie 13,14 soll er in die if-Verzweigung. Wenn ich das Programm starte als Monat 13 eingebe kommt die if-Verzweigung und dann gib ich 12 ein und er schmeißt mir eine Fehler Meldung.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13
at kalender.Kalender.getKopfzeileMonatsblatt(Kalender.java:73)
at kalender.Kalender.zeigeMonat(Kalender.java:91)
at kalender.Kalender.auswahlMenue(Kalender.java:303)
at start.Start.main(Start.java:18)

Es tut mir das ich den Code nicht als Tag poste. Ich weiß nicht wie das funktioniert. 🙁

private int liesMonat() { // Eingabe der Monatszahl 2-stellig / 1 - 12
System.out.println("Bitte gebe eine Monatszahl ein: ");
int monat = scan.nextInt();

if (monat < 1||monat > 12) {
System.out.println("Bitte geben Sie eine gültige Zahl an (1-12):");
liesMonat();
}

Ich bedanke mich im Voraus.
 
Du zeigst uns nur sehr wenig Code. Ich vermute, dass nach dem if irgendwo ein "return monat" folgt.
Wenn das so ist, dann fehlt bei deinem "liesMonat"-Aufruf die Behandlung des zurückgelieferten Wertes.
Also etwa: "monat = liesMonat();"
Derzeit wird "monat" einmal belegt (beim ersten Lesen) und nie wieder verändert.
 
Schließe mich der Vermutung von Dompteur an. Und für die Zukunft:
[ Code = Java ]hier dann dein Code[ / Code ]
und das ohne die Leerzeichen in den eckigen Klammern, die sind hier nur drinnen, damit eben kein Code-Fenster draus wird.
 
Java:
public class Kalender { // start of class
  
   /*
    *
    * Erstellen eines Objektes für "Scanner" um eine Benutzereingabe auf der
    * Konsole zu ermöglichen.
    *
    * Erstellen eines Objektes für "KalenderFunktionen" um gewisse Methode hier
    * einzufügen.
    *
    */

   Scanner scan = new Scanner(System.in);
   KalenderFunktionen kalfunk = new KalenderFunktionen();
  
   /*
    * Ich Deklariere und Initialisiere "auswahl" als Privat damit ich sie nur hier in der Klasse "Kalender" benutzen kann.
    * Sie dient als Auswahl für das Kalender Format, was der Kunde auswählen kann.
    */
   private String formatAuswahl = ""; // "1" = Amerikanischer-Kalender ,"2" = Deutscher-Kalender

   /*
    * Diese Methode gibt die Wochentage "So, Mo, Di, Mi, Do, Fr, Sa" aus jenachdem ob es Amerikanischer Kalender
    * (US)ist oder ob es ein Deutscher Kalender(DE) ist "Mo, Di, Mi, Do, Fr, Sa, So"
    */
   private String wochenTageInKurzform(int wochenTage) {

     if (formatAuswahl.equals("1")) {

       return kalfunk.wochentagkurz[wochenTage];

     } else {

       return kalfunk.wochentagkurz[(wochenTage + 1) % 7];

     }

   }// end of getWochenTagKurz()

   private int wochenTageImJahr(int jahr, int n) {

     if (formatAuswahl.equals("US")) {

       return kalfunk.wochentag_im_jahr(jahr, n);

     } else {

       return (kalfunk.wochentag_im_jahr(jahr, n) + 6) % 7;

     }

   }

   private String getKopfzeileMonatsblatt(int jahr, int monat)

   {

     String kopfzeileMonatsblatt = "******************* " + kalfunk.monatsname[monat] + " " + jahr + " *******************\n";

     for (int tageKurz = 0; tageKurz < 7; tageKurz++) {

       kopfzeileMonatsblatt += wochenTageInKurzform(tageKurz) + "\t";

     }

     return kopfzeileMonatsblatt;

   }



   public void zeigeMonat(int jahr, int monat)

   {

     String kopfZeile = getKopfzeileMonatsblatt(jahr, monat);

     System.out.println(kopfZeile);

     int monatslaenge = kalfunk.monatslaenge[kalfunk.schaltjahr(jahr)][monat];

     int tagesnummerDesMonatsImJahr = kalfunk.tagesnummer(1, monat, jahr);

     int wochentagTagesnummerImJahr = wochenTageImJahr(jahr, tagesnummerDesMonatsImJahr);

     for (int keineTage = 0; keineTage < wochentagTagesnummerImJahr; keineTage++) {

       System.out.print("  \t");

     }

     for (int tag = 1; tag < monatslaenge; tag++) {

       int tagesNummerImJahr = kalfunk.tagesnummer(tag, monat, jahr);

       int wochentagImJahr = wochenTageImJahr(jahr, tagesNummerImJahr);

       System.out.print(getAufzählungsNullen(tag) + "\t");

       if (wochentagImJahr == 6) {

         System.out.println();

       } // end of if-Verzweigung

     } // end of for-Schleife

   } // end of zeigeMonat()

   public String getAufzählungsNullen(int tag) {

     String tagesZahl = String.valueOf(tag);

     if (tagesZahl.length() == 1) {

       return "0" + tagesZahl;

     } else {

       return tagesZahl;

     }// end of if/else-Verzweigung

   } // end of getAufzählungsNullen

   public void zeigeJahr(int jahr)

   {

     for (int monat = 1; monat <= 12; monat++) {

       zeigeMonat(jahr, monat);

       System.out.println();

       System.out.println();

     }

   }

   private int liesMonat() { // Eingabe der Monatszahl 2-stellig / 1 - 12

     System.out.println("Bitte gebe eine Monatszahl ein: ");

     int monat = scan.nextInt();

     if (monat < 1||monat > 12) {

       System.out.println("Bitte geben Sie eine gültige Zahl an (1-12):");
      
       liesMonat();
      

     }

     return monat; // [USER=49078]@Return[/USER] monat - Die Monatszahl wird zurückgegeben.

   } // end of liesMonat()

   private int liesJahr() { // Eingabe der Jahreszahl 4-stellig

     System.out.println("Bitte eine Jahreszahl eingeben: ");

     int jahr = scan.nextInt();

     int laenge = String.valueOf(jahr).length(); // Die Laenge vom Wert Jahr wird als Integer laenge abgespeichert.
    
     /*
      * Wenn die Jahreszahl nicht 4-stellig, dann gibt die if-Verzweigung einen Error Text.
      * "Bitte geben Sie eine 4-stellige Zahl an: "
      * Daraufhin fängt die Methode nochmal von vorne an.
      */
     if (laenge != 4) {

       System.out.println("Bitte geben Sie eine 4-stellige Zahl an: ");

       liesJahr();

     }

     return jahr; // [USER=49078]@Return[/USER] jahr - Die 4-stellige Zahl wird zurückgegeben

   } // end of liesJahr()


  
   /*
    * auswahlMenue() dient als Steuermodul für den Benutzer
    */

   public void auswahlMenue() {

     Scanner sc = new Scanner(System.in); // Einen interner Scanner in der Methode
    
     /*
      * Der Benutzer wird gefragt welches Format er gerne haben will.
      * Amerikanisches Format: So, Mo, Di, Mi, Do, Fr, Sa
      * Deutsches Format:    Mo, Di, Mi, Do, Fr, Sa, So
      * Diese Auswahl wird dann Global abgespeichert.
      */
     while (!this.formatAuswahl.equals("2") && !this.formatAuswahl.equals("1")) {

       System.out.println("Auswahl:\t[1] amerikanisches Format");
     System.out.println("Auswahl:\t[2] deutsches Kalenderformat");

       this.formatAuswahl = sc.nextLine();
      
      
     }
    
    
     int counter=20;
    
     for(int i = 0; i < counter; i++) {

       /*
        * Abfrage welche Funktion man haben will.
        * 1) Kalender fuer das ganze Jahr also 12 Monatsblätter
        * 2) Ausgabe Monatsblatt
        * 0) Ende des Programms, also der Nutzer entscheidet wann schluss ist.
        */
       System.out.println();

       System.out.println("Auswahl:\t[1] Kalender fuer das ganze Jahr");

       System.out.println("Auswahl:\t[2] Ausgabe Monatsblatt");

       System.out.println("Auswahl:\t[0] Ende des Programms");

       int funktionAuswahl = sc.nextInt();
      
      
      
      
       /*
        * Die If Anweisung gibt ein Error Text wieder wenn funktionAuswahl größer ist als 2 oder kleiner ist als 0.
        * z.B{...-3,-2,-1,3,4,5,6...}
        */
       if (funktionAuswahl > 2 || funktionAuswahl < 0) {
         System.out.println("----------------------------------------");
         System.out.println("Geben Sie bitte entweder 1, 2 oder 0 ein");
         System.out.println("----------------------------------------");
         System.out.println();

       }

      
       /*
        * Hier befindet sich die else Anweisung. Hier wird alles gesteuert. Der Benutzer wird hier weitergeleitet zu
        * den entsprechenen Methoden.
        */
       else {
        
         /*
          * Wenn der Benutzer die 1 auswählt dann wird er weitergeführt zur Methode liesJahr(). In dieser Methode
          * liesJahr gibt er eine 4-stellige Jahreszahl ein. Diese Jahrezahl wird zurück gegeben(return) und dann
          * wird der Wert als "int jahr" abgespeichert. Daraufhin wird die ganze Konfiguration in der Methode
          * "zeigeJahr(jahr)"(jahr ist der Wert den der Benutzer bei liesJahr geschrieben hat) übernommen.
          */
         if (funktionAuswahl == 1) {

           int jahr = liesJahr();

           zeigeJahr(jahr);
         }
          
          /*
          * Wenn der Benutzer 2 als Auswahl auswählt dann wird nach dem Jahr gefragt in der Methode liesJahr und
          * es wird nach dem Monat gefragt in der Methode liesMonat. Diese Werte werden zurückgegeben (return) und
          * abgespeichert.
          * Der Wert von liesJahr() wird als int jahr abgespeichert und der Wert von liesMonat() wird als int Monat
          * abgespeicher. Diese Werte werden an zeigeMonat(jahr, monat) gegeben.
          */
          else if (funktionAuswahl == 2) {

           int jahr = liesJahr();

           int monat = liesMonat();

           zeigeMonat(jahr, monat);
          }
        
          /*
          * Wenn der Benutzer als Auswahl 0 eingibt dann wird das Programm beendet.
          */
         else if (funktionAuswahl == 0) {

           break;

         }

       } //end of else-Verzweigung
      
       /*
        * counter wird am Ende immer erhöht da der Benutzer entscheiden kann mit der Auswahl 0 wann das Programm
        * beendet wird.
        */
       counter = counter + 1;
      
     }  // end of for-Schleife

     sc.close(); // Der Scanner wird geschlossen.

   }// end of auswahlMenue()

}// end of class
 
Du zeigst uns nur sehr wenig Code. Ich vermute, dass nach dem if irgendwo ein "return monat" folgt.
Wenn das so ist, dann fehlt bei deinem "liesMonat"-Aufruf die Behandlung des zurückgelieferten Wertes.
Also etwa: "monat = liesMonat();"
Derzeit wird "monat" einmal belegt (beim ersten Lesen) und nie wieder verändert.
Ich hab jetzt mal den ganzen Code gepostet und ich denke du meinst ganz unten im auswahlMenue().
 
Wie in der Vermutung schon gesagt: du reichst den richtigen Wert nicht bis zur obersten Schicht weiter. Konkret: deine Methode funktioniert nur, wenn man schon beim ersten Mal eine richtige Eingabe tätigt.
Ansonsten rufst du die Methode rekursiv auf, ignorierst aber den return Wert.
Passe das wie oben beschrieben an und es funktioniert 😉

PS: Das ist übrigens auch bei liesJahr so 😉
PPS: Zieh deine Konvention für das Darstellungsformat konsequent durch. Du kannst nicht einmal auf equals("1") und ein anderes Mal auf equals("US") prüfen 😉
PPPS: und die Schleife für dein Menü mach bitte so wie bei der Eingabe welches Kalenderformat man haben möchte. Das mit counter ist sehr unschön.
 
Zuletzt bearbeitet:
Danke habt mir echt geholfen^^
Das mit den counter wollte ich nicht machen, ich wollte eine endlos Schleife machen weil der Benutzer eh entscheiden kann wann Schluss doch mein Prof meinte das endlos Schleifen nicht schön bin. Ich hatte davor die grenze 20 aber dann dachte ich mir was ist wenn der Benutzer 20 mal falsch angaben macht.
 
Es ist auch keine Endlosschleife, diese wäre ja while(true), du solltest aber (analog wie oben bei der Wahl des Anzeigeformats) while(funktionAuswahl != 0). Das ist dann eine Schleife mit Abbruchbedingung und keine Endlosschleife.
 
Es ist auch keine Endlosschleife, diese wäre ja while(true), du solltest aber (analog wie oben bei der Wahl des Anzeigeformats) while(funktionAuswahl != 0). Das ist dann eine Schleife mit Abbruchbedingung und keine Endlosschleife.
Das problem ist er erkennt funktionAuswahl nicht an weil funktionAuswahl in der Schleife deklariert und initialisiert wird durch die Benutzereingabe.
 
Achso sry ja das hab ich nicht geschaut, wo das deklariert wird.
Deklariere die Variable vor der Schleife und weise ihr am Anfang z.B. den Wert -1 zu damit du in die Schleife gelangst und sonst alles wie gehabt 😉
 

Neue Themen


Zurück
Oben