Java Variable nicht initialisiert obwohl sie es eigentlich sein müsste

torben

Ensign
Registriert
Feb. 2014
Beiträge
254
N'abend Leute,
sitze grad an meinen Hausaufgaben und weiß leider nicht mehr weiter. Es geht darum, dass wir ein Konsolen-Programm erstellen sollen, dass drei Zahlen einliest und anschließend die zwei höchsten in entsprechender Reihenfolge ausgibt.
Hatte schon mehrere Ansätze, bei dem einen haben dann immer wieder nicht die Reihenfolge gestimmt. Deswegen habe ich mich entschlossen es neu zu machen und denke, dass ich an sich den "richtigen" Weg gefunden habe(!?).
Problem ist nur jetzt, dass die beiden Variablen zu Ausgabe angeblich nicht initialisiert werden, obwohl sie es eigentlich müssten. Entweder stehe ich grade einfach nur auf dem Schlauch oder mache etwas grundlegend falsch...

Achja zu mir: Machen jetzt Java seit etwa 6 Wochen in der Schule und haben vorher nur bisschen mit Small Basic gemacht. Grundlegende Fachbegriffe sind mir eigentlich schon geläufig.

Hoffe jemand kann mir sagen, was ich falsch mache, oder mich zumindest in die richtige Richtung weisen.
Danke schonmal
Code:
public class c2 {
  
  public static void main(String[] args) {
    int Zahl1,Zahl2,Zahl3,MAX1,MAX2;
    Zahl1=3;
    Zahl2=2;
    Zahl3=1;
    if (Zahl1>Zahl2 && Zahl1>Zahl3) {
      MAX1=Zahl1;
        if (Zahl2>Zahl3) 
         MAX2=Zahl2;
        else 
         MAX2=Zahl3;
                
      }
    else {
        if (Zahl2>Zahl1 && Zahl2>Zahl3){
           MAX1=Zahl2;
           if (Zahl1>Zahl3) 
            MAX2=Zahl1;          
           else 
           MAX2=Zahl3; 
      } // end of if
      
      else {
        if (Zahl3>Zahl1 && Zahl3>Zahl2) {
          MAX1=Zahl3;
          if (Zahl1>Zahl2)
            MAX2=Zahl1;          
          else
            MAX2=Zahl2;          
        } // end of if
      } // end of if-else
    } // end of if-else
       
    System.out.print( MAX1 + MAX2 );    
  } // end of main

} // end of class c2

PS: Das mit dem Einlesen wird nachher einfach durch entsprechende Zeilen einer Keyboard Class eingefügt, was demnach kein Problem darstellt.
 
MAX1,MAX2 haben aber keinen wert mitbekommen, nur Zahl1,Zahl2,Zahl3

öhm das hätte man doch sicher eleganter ohne diese vielen if/else schreiben können mit irgendeiner max.funktion
 
Initialisieren = keinen Wert mitgegeben. int MAX = 0; ist eine Initialisierung, int MAX; lediglich eine Deklaration.
 
Schau mal Zeile 5 bis 7 an. Das must du auch mit den beiden anderen Variablen machen. Als Wert einfach nur 0.
 
öhm das hätte man doch sicher eleganter ohne diese vielen if/else schreiben können mit irgendeiner max.funktion

Bestimmt aber ich wollte es zumindest erstmal zum funktionieren bringen und so etwas haben wir auch noch nicht gemacht.
Ergänzung ()

esb315 schrieb:
Schau mal Zeile 5 bis 7 an. Das must du auch mit den beiden anderen Variablen machen. Als Wert einfach nur 0.
Öhm joa. Das hats gebracht! Danke.
Aber was hätte ich schreiben müssen, ohne vorher einen Wert zuzuweisen müssen? :freak:
 
Zuletzt bearbeitet:
Das Problem ist folgendes: Es ist möglich das nach deinen ganzen if-else Verzweigungen MAX1 und MAX2 immer noch keinen Wert haben. Der Compiler erkennt das es ein Szenario gibt, bei dem Max1 und Max2 nicht initialisiert wurden.

Code:
public static void main(String[] args) {
        int Zahl1, Zahl2, Zahl3, MAX1, MAX2;
        Zahl1 = 3;
        Zahl2 = 2;
        Zahl3 = 1;
        if (Zahl1 > Zahl2 && Zahl1 > Zahl3) {
            MAX1 = Zahl1;
            if (Zahl2 > Zahl3) {
                MAX2 = Zahl2;
            } else {
                MAX2 = Zahl3;
            }

        } else if (Zahl2 > Zahl1 && Zahl2 > Zahl3) {
            MAX1 = Zahl2;
            if (Zahl1 > Zahl3) {
                MAX2 = Zahl1;
            } else {
                MAX2 = Zahl3;
            }
        } 
        else if (Zahl3 > Zahl1 && Zahl3 > Zahl2) {
            MAX1 = Zahl3;
            if (Zahl1 > Zahl2) {
                MAX2 = Zahl1;
            } else {
                MAX2 = Zahl2;
            }
        } else {
            // alle Sonderfälle werden hier abefangen, damit MAX1 und MAX2 nach dieser Zeile garantiert einen Wert haben
            MAX1 = 2;
            MAX2 = 3;
        }

        System.out.print(MAX1 + MAX2);
   }
 
Zuletzt bearbeitet:
Ok, danke. Gut zu wissen, damit man weiß wovon man überhaupt spricht.
Aber wieso musste ich denn jetzt vorher die Variablen MAX1,MAX2 initialisieren wenn ich sie vorher ja schon deklariert und unten durch die Bedingung zuweisen würde. Also sprich, Java meckert hier, weil es keinen Wert zum Anfangszeitpunkt gibt?
Ergänzung ()

Hooo schrieb:
Das Problem ist folgendes: Es ist möglich das nach deinen ganzen if-else Verzweigungen MAX1 und MAX2 immer noch keinen Wert haben. Der Compiler erkennt das es ein Szenario gibt, bei dem Max1 und Max2 nicht initialisiert wurden.
Ja, das dachte ich mir jetzt nachdem es mir den Unterschied zwischen Deklarieren und Initialisieren kenne.
 
Zuletzt bearbeitet:
Hooo hat das schon sehr gut erklärt.
Nochmal zum Verständnis: Auch wenn du denkst, dass du da oben alles abdeckst, tust du das mitnichten. Für den Fall, dass zwei Werte gleich sind hast du überhaupt keine Behandlung und die ganze if/else Sache läuft total ins Leere.
 
Nein, es ist kein Denkfehler. Eine if-Anweisung gibst du mit einer Bedingung ab, also kann es auch vorkommen, dass der Inhalt nicht ausgeführt wird. Die Variable MUSS aber einen Wert haben/initalisiert werden, sonst gibt es einen Fehler.

Nur als Beispiel: Was würde passieren, wenn alle Zahlen gleich groß sind?
Natürlich kannst du dies durch genauere Bedingungen o.ä. ausschließen, aber aus diesem Grund gilt eine Zuweisung innerhalb eines Blocks mit Bedingung NICHT als Initialisierung.

Lg, Franz
 
Für den Fall, dass zwei Werte gleich sind hast du überhaupt keine Behandlung und die ganze if/else Sache läuft total ins Leere.
Ich weiss,danke. Ist auch erstmal so gewollt, das es momentan lt. unserem Lehrer nur um die Logik geht, dass wir wissen, wie wir so eine Aufgabe überhaupt angehen. Und wir einfach mal von ausgehen, dass nicht alle oder zwei eingegeben Zahlen gleich sind.
Gut damit wäre das Problem gelöst, vielen Dank an euch alle :)
 
Vielleicht hätte man in diesem Zusammenhang noch klarstellen können, dass in Java lokale Variablen initialisiert werden müssen. Einfache Instanzvariablen hingegen haben einen Default Value.
 
Ahh okay. Wieder etwas, dessen ich mir nicht bewusst war, da sowas schlichtweg von unserem Lehrer nicht erwähnt wurde.:freak:
 
Wär's nicht schöner, die Zahlen in ein Array zu stecken, nach absteigender Größe zu sortieren und dann eben nur die ersten 2 auszugeben? Sparst du dir dieses unanschauliche if-else-if-else Rumgeeiere.
 
Zurück
Oben