Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden?

marlonski

Neues Mitglied
Vorweg ich bin JAVA Einsteiger. Hatte schon viel im Netzt nach einer Lösung gesucht. Aber vielleicht fehlt mir da ein bestimmtes Grundwissen.
Pein Problem: Ich hatte eine MySQL abfrage gemacht und der Wert wurde in einer Schleife ermittelt.
Jetzt wollte ich diesen Wert "datenstring " außerhalb der Schleife nutzen, aber dieser Wert ist nicht vorhanden.

[CODE lang="java" title="Code"] Statement myStat = con.createStatement();
ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");

while(daten.next()){
System.out.println(daten.getString(1));
String datenstring = datzen.getString(1);
}
// hier erfolgt nicht mehr die Anzeige in der Console
System.out.println(datenstring);[/CODE]
 
Stell dir vor, das ResultSet daten hätte keine Daten, weil z.B. die Datenbankabfrage ins Leere läuft. Dann würde die While-Schleife nicht durchlaufen und der String datenstring nicht erstellt werden.

Vielleicht kannst Du das hier mal versuchen. Du initialisierst einen String mit null und prüfst später, ob er immer nocht null ist.

Java:
Statement myStat = con.createStatement();
ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");

// Initialisierung des Strings.
String datenstring = null;

while(daten.next()){
    System.out.println(daten.getString(1));
    datenstring = daten.getString(1);
}   

// Wenn der String nicht null ist, sind Daten vorhanden.
if (datenstring != null) {
    System.out.println(datenstring);
} else {
    System.out.println("Keine Daten vorhanden");
}
 
Also generell ist es so, dass man sich immer über die Daten Gedanken machen muss. Was für Daten willst Du speichern?

In Deinem Fall ist es eine Liste von Strings. Also musst Du dafür die notwendigen Datenstrukturen bereit stellen. Bei der Liste von Strings ist dies einfach:
Java:
List<String> daten = new ArrayList<>();

Und die kannst Du nun in einer While-Schleife füllen:
Java:
ResultSet resultSet = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");

List<String> daten = new ArrayList<>();

while(resultSet.next()){
    System.out.println(resultSet.getString(1));
    daten.add(resultSet.getString(1));
}

Das kann aber universell gemacht sein:
a) Die Daten kommen in eine Klasse. Das ist die Entity.
b) Du hast eine Methode, die eine Entity erzeugt und die Werte des resultSet hinzufügt.

Java:
ResultSet resultSet = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");

List<Entity> daten = new ArrayList<>();

while(resultSet.next()){
    daten.add(createEntity(resultSet));
}

Der Adapter erzeigt dann die neue Instanz und packt die Daten von der aktuellen row des ResultSet da rein.

Damit hätten wir ein ganz universelles Pattern, das man einfach 1:1 verwenden kann. Und das ist dann typischer Code, den man in einer DAO Klasse halten kann.
 
Um auch mal eine Antwort für dein Problem mit der Variablen "datenstring" zu geben:

Variablen haben einen Gültigkeitsbereich. In der Regel endet dieser Gültigkeitsbereich an der schließenden geschweiften Klammer:
Java:
public static void main(String[] args) { // hier beginnt ein Gültigkeitsbereich

    int var1 = 1; // Variable im Gültigkeitsbereich 1

    for (int i = 0; i > 10; i++) // hier beginnt der Gültigkeitsbereich für "i" und für var2
    {
        int var2 = 2;
    } // hier endet der Gültigkeitsbereich für "i" und "var2"

    println(var2); // geht nicht, weil "var2" hier nicht mehr bekannt ist

} // hier endet Gültigkeitsbereich 1 und damit auch die Gültigkeit von Variable "var1"

Das ist auch der Grund, weshalb du mehrere Schleifen hintereinander, mit der gleich benannten Schleifenvariablen, haben kannst:
Java:
for (int i = 0; i < 10; i++) { // dies ist ein anderes "i"
    // code 1
}

for (int i = 0; i < 10; i++) { // als dieses "i"
    // code 2
}

// Das geht allerdings nicht:

for (int i = 0; i < 10; i++) {
    for (int i = 0; i < 10; i++) { // Diese "i" ist im selben Bereich wie das erste "i", also doppelt deklariert
        // code
    }
}


Genau das trifft auch auf deine Variable "datenstring" zu. Sie ist einfach nicht mehr gültig.

Lösung ist es, den Gültigkeitsbereich zu erweitern, indem die Variable im nächst größeren Gültigkeitsbereich deklariert wird:
Java:
String datenstring = ""; // vor der Schleife deklarieren

while(daten.next()){
    System.out.println(daten.getString(1));
    datenstring = datzen.getString(1);
}

Generell gilt allerdings weiterhin, dass man Variablen so spät wie möglich deklarieren sollte und damit den Gültigkeitsbereich so eng wie möglich hält.
 
Zuletzt bearbeitet:
Einsteiger....Grundwissen
Weiterhin: es gibt in Java die Option eine Variable mit "static" zu initialisieren (i.S. einer global gültigen Variable). Übertreiben sollte man es mit dessen Gebrauch aber nicht, sonst darf man alle Stellen, die von Werten dieser Variablen abhängig sind (oder diese verändern können), auf Seiten- und Nebeneffekte hin überprüfen.
 
Weiterhin: es gibt in Java die Option eine Variable mit "static" zu initialisieren (i.S. einer global gültigen Variable). Übertreiben sollte man es mit dessen Gebrauch aber nicht, sonst darf man alle Stellen, die von Werten dieser Variablen abhängig sind (oder diese verändern können), auf Seiten- und Nebeneffekte hin überprüfen.
Solche Tipps sollte man gar nicht erst geben. Grundsätzlich sollte das einzige "static" an der main() Methode stehen. Alles andere sind Ausnahmen für besondere Fälle.
 
Java:
  ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");
  while(daten.next()){
    String datenstring = daten.getString(1);
  }
Hier ist "datenstring" - wie bereits mehrfach erwänt - nur innerhalb der while-Schleife definiert.
Java:
  String datenstring = "";
  ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");
  while(daten.next()){
    String datenstring = daten.getString(1);
  }
Hier ist "datenstring" zwar auch außerhal der while Schleife definiert. Er enthält aber nur das letzte Ergebnis.
Solltest du nur ein Ergebnis erwarten, würde ich dies deutlich machen, indem "while" durch "if" ersetzt wird:
Java:
  String datenstring = "";
  ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");
  if(daten.next()){
    String datenstring = daten.getString(1);
  }
Ansonsten solltest du die Ergebnisse auch innerhalb der while-Schleife verarbeiten:
Java:
  ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");
  while(daten.next()){
    String datenstring = daten.getString(1);
    // mache etwas mit "datenstring"
  }
 
Danke an alle für die Hilfe.
Ich konnte von alle etwas an Lösungsvorschlägen mitnehmen.


[CODE lang="java" title="Meine Lösung"]double neuerwert = 28.00;


ResultSet daten = myStat.executeQuery("SELECT `Betrag` FROM `Kontostand` WHERE `Anbieter` = 'Test'");
while(daten.next()){

double datendouble = Double.parseDouble(daten.getString(1));

if(datendouble <= neuerwert) {
System.out.println("Daten in Datenbank schreiben");
}
else
{
System.out.println("Wert zu gering " + neuerwert);
}[/CODE]
 

Zurück
Oben