Wie kann ich den Fehler bei "If .... else"..." loswerden ?
Ich habe echt so gut wie keine erfahrung mit Java aber wollte einfach mal den sprung wagen da wir in ein paar wochen sowieso mit dem Thema in Informatik anfangen werden. Nun wollte ich einen einfachen Taschenrechner Programmieren bei dem man durch JOptionPane.showInputDialog gefragt wird welche 2 Zahlen, und mit welchem von den 4 Rechenzeichen man Gleichung ausrechnen möchte. Ich habe mir überlegt das ganze mit If und else zu lösen (Siehe bild) nun ist mein Problem dass ab dem 2. Else das else als fehler erkannt wird und trotz vielen Tutorials habe ich es nicht geschafft herauszufinden woran das liegt.
Ich habe Eclipse erst seit Gestern Abend aber möchte halt wenigstens die Grundlagen dazu kennen und wenigstens das aus reiner Interesse schaffen. :D
Wenn ihr eine Idee habt, wisst wo der fehler liegt oder in selber mal hattet wäre ich über jede Hilfe Dankbar.
msg. KznPctrs

6 Antworten
Das Semikolon muss weg und ein else (ohne weiteres if) nimmt keine Bedingung.
if (condition) {
expression;
} else if (condition) {
expression;
} else {
expression;
}
Außerdem musst Du Deine Variable außerhalb der Abfragen deklarieren, also ...
int loesung = 0;
if (condition) {
loesung = 1;
} else {
loesung = 2;
}
Variablen, die in einem Block deklariert werden, werden nämlich verworfen, sobald der Block verlassen wird.
Um Strings auf Gleichheit zu prüfen, solltest Du außerdem die Methode String.equals(String s) verwenden.
Also nicht ...
String s = "Hallo";
if (s == "Hallo") {
doSomething();
}
... sondern ...
String s = "Hallo";
if (s.equals("Hallo")) {
doSomething();
}
String ist nämlich ein Referenztyp und der == Operator prüft bei Referenztypen, ob die Speicheradressen, auf die sie zeigen, identisch sind, also ob die Strings an der selben Adresse im Speicher gespeichert sind.
Um auf inhaltliche Gleichheit zu prüfen, musst Du die .equals(...)-Methode der Klasse String aufrufen.
Deklarieren heißt einfach, dass man eine Variable "festlegt", ihr also einen Namen gibt und sagt, welchen Typ sie annehmen soll.
int n;
Meistens wird sie auch noch im gleichen Zug initialisiert:
int n = 0;
//ist das gleiche wie
int n;
n = 0;
Variablen "leben" immer in dem Block, in dem sie deklariert worden sind und in untergeordneten Blöcken.
(Variable deklarieren = einer Variablen einen Namen und Datentyp zuweisen.)
Wenn Du eine Variable innerhalb einer If-Verzweigung (oder Schleife oder Methode) deklarierst, dann existiert diese Variable nur, bis die Verzweigung (oder Schleife oder Methode) verlassen wird. Danach ist die Variable sozusagen "weg" (auch wenn sie häufig tatsächlich noch auf dem Stack liegen bleibt, aber auf sie kann nicht mehr zugegriffen werden - der Compiler "kennt sie nicht mehr", nachdem der Block verlassen wurde).
Wenn Du einer Variablen innerhalb einer Verzweigung einen Wert zuweisen und diesen außerhalb der Verzweigung auslesen möchtest, musst Du die Variable daher vor der Verzweigung deklarieren. Hinter der Verzweigung geht nicht, weil sie ja bereits existieren muss, wenn die Verzweigung betreten wird und innerhalb der Verzweigung geht auch nicht, weil die Variable dann nicht mehr existieren würde, sobald die Verzweigung verlassen wird. Du möchtest sie aber außerhalb der Verzweigung auslesen, also muss sie dann noch existieren, also darfst Du sie nicht in der Verzweigung deklarieren.
Hinter else...if darf kein Semikolon. Die Variable "lösung" muss vor dem if-else-Konstrukt angelegt werden und der Umlaut in dem Variablennamen könnte auch problematisch werden. Und ganz am Ende muss "else if" anstatt "else" hin. Ein echter "else"-Zweig (so dass eine Meldung kommt, wenn man nicht +,-,* oder / eingibt, wäre auch noch schön.
Außerdem muss ein richtiger Rechner auch Divisionen durch Null abfangen. ;)
Ja das stimmt.
Aber wie gesagt habe ich erst Gestern damit angefangen mich damit auseinander zu setzen und wollte erstmal nur mit den Grundlagen zurechtkommen.
Kleiner Hinweis: Gewöhn dir schonmal den Java Styleguide an:
http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
So werden Variablen immer klein begonnen und die Klammerung ist anders:
http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html#449
Dann:
-die zweite else if wird nicht erkannt, weil hinter der ersten else if ein Semikolon ist. Dies beendet den aktuellen Befehl und die nachfolgenden else haben keine Ausgangsbedingung mehr, durch die sie eintreffen könnten.
-Man vergleicht in Java keine Strings mit ==. String ist kein primitiver Datentyp und durch == wird hier nicht geprüft, ob der Inhalt gleich ist. Du müsstest das durch if(z.equals("+")) usw lösen.
- Du solltest keine Umlaute (wie das ö) nutzen.
- Du erstellst in jedem if-Block eine lokale Integer-Variable "Lösung". Die ist aber nur innerhalb dieses if-Blocks sichtbar. Um das Ergebnis am Ende nutzen zu können, müsstest du die Variable schon davor deklarieren (ihr also einen Datentyp und den Namen zuweisen), mit einem Wert (z.B. 0) initialisieren und dann im if-Block verändern.
Beispiel:
int loesung = 0;
if(z.equals("+")){
loesung = zahl1 + zahl2;
}
if(z.equals("-")){
loesung = zahl1 - zahl2;
}
if(z.equals("*")){
loesung = zahl1 * zahl2;
}
if(z.equals("/")){
loesung = zahl1 / zahl2;
}
System.out.println(loesung);
if-Schleife
Beliebter Fehler: Ein if-Block ist keine Schleife, sondern eine Verzweigung.
Stimmt natürlich und ist nicht korrekt, hat sich aber iwie eingebrannt :P
Variablennamen deklariert man für gewöhnlich mit Kleinbuchstaben, ebenso bitte auf Umlaute verzichten. Strings auch nicht mittels "==" vergleichen. Ein weiteres Problem ist, dass du einem einzelnen "else" eine Bedingung anschließt, das ist nicht erlaubt. Dazu niemals ein Semikolon hinter if, else, try, catch etc setzen:
int loesung;
if (z.equals("+"))
loesung = zahl1 + zahl2;
else if (z.equals("-"))
loesung = zahl1 - zahl2;
else if (z.equals("/"))
loesung = zahl1 / zahl2;
else if (z.equals("*"))
loesung = zahl1 * zahl2;
Am Ende von if und else if gehört hinter der ) kein Semikolon.
Kannst du mir das mit dem deklarieren nochmal ein wenig besser erklären ? denn ich glaube dass dort nun der nächste Fehler ist.