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.
 

Dompteur

Top Contributor
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.
 

flopalko

Bekanntes Mitglied
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.
 

GreenTeaYT

Mitglied
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
 

GreenTeaYT

Mitglied
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().
 

flopalko

Bekanntes Mitglied
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:

GreenTeaYT

Mitglied
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.
 

flopalko

Bekanntes Mitglied
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.
 

GreenTeaYT

Mitglied
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.
 

flopalko

Bekanntes Mitglied
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 ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Warum speichert meine String-Variable nummerische Werte? Java Basics - Anfänger-Themen 3
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
E Variable von 1. Fenster an 2. Fenster übergeben. Java Basics - Anfänger-Themen 7
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
T Datum als Variable wert Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
J Double Variable und Addition Java Basics - Anfänger-Themen 2
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
H Datentypen Wertebereich von <Klassenname> <Variable> Java Basics - Anfänger-Themen 12
M Private Variable Java Basics - Anfänger-Themen 2
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
s.marcii Modulo in der Variable einsetzen - ist das möglich? Java Basics - Anfänger-Themen 2
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
Y Wie kann ich die Variable in der Try Catch returnen? Java Basics - Anfänger-Themen 3
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
B Inkrement von Variable Java Basics - Anfänger-Themen 8
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
L Variable von einer Methode zu einer anderen Methode inkl. einer "Zwischenmethode" Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
H Variable um 1 erhört ausgeben Java Basics - Anfänger-Themen 4
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
J Fehlermeldung unklar. non-static variable player0 cannot be referenced from a static context Java Basics - Anfänger-Themen 4
P non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
W Problem mit dem Wert von boolean-Variable Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L cannot find symbol variable Kon Java Basics - Anfänger-Themen 8
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
H Variable.methode aufstellen, verstehen Java Basics - Anfänger-Themen 2
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
S Variable einscannen Java Basics - Anfänger-Themen 30
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
L Warum ist Variable null? Java Basics - Anfänger-Themen 3
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
A OOP Variable in anderer Klasse durch Methode aufrufen und einer anderen Variable gleichsetzen Java Basics - Anfänger-Themen 2
S Variable Parameter Java Basics - Anfänger-Themen 5
D Datei auslesen & Werte in Variable speichern Java Basics - Anfänger-Themen 12
P if - Statement erkennt variable nicht. Java Basics - Anfänger-Themen 12
J Ungewollte Wertveränderung einer Variable Java Basics - Anfänger-Themen 9
R Variablen Variable an FXML-Controller übergeben Java Basics - Anfänger-Themen 4
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
R variable istpositiv might not have been initialized Java Basics - Anfänger-Themen 2
A Methodenname aus variable Java Basics - Anfänger-Themen 2
L Variable aus einer Klasse in einer anderen Klasse nutzen Java Basics - Anfänger-Themen 6
P Methode soll Variable einer anderen Klasse ändern. Wie? Java Basics - Anfänger-Themen 1
Hanschyo Variable nicht initialisiert Java Basics - Anfänger-Themen 6
deatzi Variable aus If Abfrage später nutzen Java Basics - Anfänger-Themen 4
L Variable in If-Statement initialisieren Java Basics - Anfänger-Themen 4
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
S Warum kann ich nicht mehr als eine Variable in einer for Schleife deklarieren ? Java Basics - Anfänger-Themen 1
J Wert eines Arrays einer Variable zuweisen, sobald der Wert eines anderen Arrays eintritt Java Basics - Anfänger-Themen 2
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
F Variablen If else: Einer Variable einen Wert hinzufügen oder so? Java Basics - Anfänger-Themen 6
Aprendiendo Interpreter-Fehler "non-static variable this cannot be referenced from a static context" Java Basics - Anfänger-Themen 2
D Aufruf einer statischen Variable Java Basics - Anfänger-Themen 1
F [OOP] Auf eine Variable aus meherer Klassen zugreifen Java Basics - Anfänger-Themen 22
D Einer Variable automatisch Zahlen hinzuaadieren Java Basics - Anfänger-Themen 3
BadBat Klassen instanz als variable + methodenaufruf Java Basics - Anfänger-Themen 4
BadBat Variablen Eine Variable mit 2 Typen Java Basics - Anfänger-Themen 38
S Cannot find symbol (symbol ist eine Variable) Java Basics - Anfänger-Themen 13
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
M Variable noch erstellen oder lieber so? Java Basics - Anfänger-Themen 1
G Variable Objektnamen Java Basics - Anfänger-Themen 43
B Variable in mehreren Klassen nutzen Java Basics - Anfänger-Themen 4
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben