Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden?
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.
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.
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: