[erledigt] Variable initialisiert, aber nicht verfügbar (Schleife)

Hasenherz

Mitglied
Während einiger Versuche mit kleineren Testprogrammen bin ich auf ein merkwürdiges Problem gestoßen.

Definiere ich eine Variable innerhalb einer Schleife, kann ich diese in der Schleife nutzen (im Beispielcode: ausgeben und damit rechnen).
Außerhalb der Schleife ist sie nicht mehr verfügbar. Eine Ausgabe ist nicht mehr möglich. NetBeans zeigt mir auch keine Verknüpfung zwischen der Variable außerhalb und innerhalb der Schleife.

Woran liegt es? Hier der Beispielcode:
Java:
import java.util.Scanner;

public class versuchWhile {

   public static void main(String[] args) {

// Variablen initialisieren
       
        Scanner eingabeZahl; boolean eingabe = false;
        
// Eingabe wird wiederholt, bis eine gültige Zahl eingegeben wird
        
        while (!eingabe) {
            System.out.print("Bitte eine Zahl eingeben: ");
            eingabeZahl = new Scanner(System.in);
            if (eingabeZahl.hasNextInt()) {
                eingabe = true; // gültig? Dann Schleife beenden
                int zahlConvert = eingabeZahl.nextInt();
                System.out.println("Die Zahl ist verfügbar: " + zahlConvert);
                System.out.println("und man kann mit ihr rechnen: " + zahlConvert*2);
            } else {
                System.out.println("Keine gültige Zahl!");
                eingabe = false; // ungültig? Dann Schleife wiederholen
            }
        }
        
        // Netbeans makelt in Zeile 30 "cannot find symbol"
        // "location: class versuchWhile"
        System.out.println("Hier ist die Variable nicht mehr auffindbar: " + zahlConvert);
        
           
    }

}
 
Zuletzt bearbeitet:
Das nennt man Scope!
Eine Variable ist nur innerhalb des Scope sichtbar in dem sie erstellt wurde.

Sprich alles was du in einer Methode deklarierst ist nur in der Methode verfügbar (solange du keine Referenz nach außen weiter gibst 😉 )
Genauso ist es auch bei Schleifen, alles was in Schleifen (oder dem Schleifenkopf) deklariert wird ist auch nur innerhalb dieser Schleife verfügbar.

Deklariere "zahlConvert" vor der Schleife dann kannst du es ganz normal für die Ausgabe verwenden.

Achtung es besteht ein Unterschied zwischen "deklarieren" eines Attributes/lokalen Variable und "initialisieren derselbigen.
Deklarieren wäre:
Code:
String s;

Initialisieren wäre:
Code:
s = "Hallo";

Beides zusammen wäre
Code:
String s = "Hallo";
 
Hmm, das macht Sinn.
Wenn ich "zahlConvert" allerdings direkt vor der Schleife zu deklarieren (und initalisieren) versuche, ist "eingabeZahl" noch nicht initialisiert, da die Zuweisung der Eingabe erst innerhalb der Schleife erfolgt -> NetBeans meckert wieder. :bahnhof:

edit: selbst wenn ich "zahlConvert" direkt zu Beginn nur deklariere
Java:
int zahlConvert;
und dann innerhalb der Schleife initialisiere
Java:
zahlConvert = eingabeZahl.nextInt();
bleibt der Fehler bestehen.

edit2: ok, nach rumprobieren 2.0 funktioniert es jetzt. Ich deklariere die Variable und initialisiere sie mit einem beliebigen Wert.
Java:
int zahlConvert = 5;
Mache ich das nicht, wird die neu-Initialisierung innerhalb der Schleife nicht erkannt. Irgendwie merkwürdig.
Sollte die Variable nicht standardmäßig auf 0 gesetzt werden, wenn bei der Deklaration kein Wert übergeben wird? Auf jeden Fall schonmal vielen Dank bis hierher 😉
 
Zuletzt bearbeitet:
Ja da müsstest du dir einen "Defaultwert" überlegen den du dieser Variable zuweist.

Ja es gibt für die primitiven Datentypen zwar Standardwerte. Warum der Compiler aber meckert kann ich dir nicht wirklich sagen! 🙁

EDIT: Hier diesen Link habe ich gefunden local primitive variables
 
Zuletzt bearbeitet:

Zurück
Oben