Problem mit if

Anleitungen usw. rund um Java, Tutorials halt.

Moderator: wegus

tux_94
Beiträge: 3
Registriert: 16.02.2012, 16:31

Problem mit if

Beitragvon tux_94 » 17.02.2012, 21:16

Hallo Leute,

nachdem ich nun schon 2 Tage erfolglos versuche ein Programm zum Laufen zu kriegen wende ich mich nun, in der Hoffnung auf einen Denkanstoß an dieses Forum.
Zuerst die "Vorgeschichte":
Wie haben in der Schule ein Java-Programm geschrieben, das nach dem Verfahren von Heron die Wurzel aus der eingegeben Zahl zieht (Anmerkung: in der Schule verwenden wir als Editor BlueJ). Erweiternd haben wir die Funktion eingebaut, dass bei der Eingabe einer negativen Zahl oder etwas anderem als einer Zahl (also Buchstaben o.ä.) eine Fehlermeldung ausgegeben wird. Der wichtigste Teil: bei Eingabe einer Zahl zwischen 0 und 1 wird eine extra Methode aufgerufen, die die Zahl erweitert, dann die Wurzel zieht und dann wieder kürzt.
Ich habe nun als Hausaufgabe aufbekommen, das ganze unter einer GUI zu verpacken. Das war dank NetBeans auch relativ einfach.
Auch das Programm an sich (also Zahl eingeben, Button klicken, Methode "wurzelHeron" aufrufen) läuft wunderbar.
Nun zum Problem:
wenn ich eine negative Zahl eingebe gibt die Methode "wurzelHeron" einfach dieselbe Zahl zurück. Also habe ich versucht eine Fallunterscheidung durchzuführen. Das klappt aber nicht. Ich habe es probiert indem ich mit der mehrmaligen Verwendung von if oder auch mit if/else die einzelnen Anweisungen auszuführen - ohne Erfolg.
Der fragliche Teil sieht momentan so aus:

Code: Alles auswählen

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        double in =  ((Double.parseDouble(inField.getText())));
        if(in>1.0)
         {
             ergLabel.setText("Ergebnis: " + Quadratwurzel6.wurzelHeron(in));
        }
        if(in<0.0)
        {
            ergLabel.setText("Ergebnis: n.d.");
        }

Dabei spielt es keine Rolle ob ich für den 2. Teil if oder else nehme - es wird scheinbar immer der erste Fall ausgeführt. Ich bin vollkommen ratlos, da in der Schule (wo Ein-und Ausgabe über die Konsole liefen) mit folgendem Code:

Code: Alles auswählen

System.out.println("Bitte eine Dezimalzahl eingeben: ");
           r = einlesen();
           if(r == 0){System.out.println("Tschüs und die Wurzel aus 0 ist 0!");};
           if(r == 1){System.out.println("Die Wurzel aus 1 ist 1");};
           if(r < 0){System.out.println("Die Wurzel aus negativen Zahlen ist nicht definiert!");};
           if((0 < r)&&(r<1)){System.out.println("Die Wurzel aus "+r+" ist "+kuerzen(wurzelHeron(erweitern(r))));};
           if(1<r){System.out.println("Die Wurzel aus "+r+" ist "+wurzelHeron(r));};

(wobei einlesen eine extra Methode zum einlesen ist und 0 das Programm beendet) alles wunderbar funktioniert. Aber halt auf der Konsole - und ich brauche diese Funktionalität bei der GUI. Das Semikolon hinter den geschweiftn Klammern habe ich auch testweise bei mir eingefügt - kein Erfolg.

Vielen Dank an jeden, der sich mein Geschreibsel bis hier durchgelesen hat und jetzt eventuell sogar noch Kraft hat zu antworten - ich bin über jeden Tip dankbar.
tux_94

tux_94
Beiträge: 3
Registriert: 16.02.2012, 16:31

Re: Problem mit if

Beitragvon tux_94 » 17.02.2012, 22:13

Ich versteh' die Welt nicht mehr. Oder zumindest versteh' ich NetBeans nicht...
Ich habe nixhts geändert (bzw. nach einigen weiteren erfolglosen Versuchen alles wieder in den Zustand zurückversetzt). Wenn ich das Programm normal ausführe tritt der oben genannte Fehler auf. ich habe dann aber spaßenshalber mal auf profile geklickt und siehe da - es läuft so wie's soll (zumindest wird die 2. Anweisung berücksichtigt).
Woran liegt das?

EDIT:
Auch das exportieren als .jar bringt nichts...

Benutzeravatar
nigjo
Beiträge: 584
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: Problem mit if

Beitragvon nigjo » 18.02.2012, 09:53

Hi

  1. Wenn du zwei Bedingungen abfragen möchtest, die sich gegenseitig ausschließen, solltest du IMMER if/else benutzen. Du handelst dir Schwierigkeiten ein, von denen du im Moment vermutlich noch nicht zu träumen wagst, wenn du dir angewöhnst die if-Abfragen einzeln hinzuschreiben.
  2. Manchmal hilft in völlig verwirrenden Situationen, wie du sie gerade erlebst ein "clean and build". Der Compiler übersetzt meist nur einen Teil deines Codes, der sich gerade geändert hat um etwas schneller fertig zu werden. Dabei kann es schon mal zu Fehlübersetzungen kommen die wiederum zu seltsamen Verhalten führen KÖNNNEN.
  3. Du solltest die vielleicht mal im Debugger anschauen und feststellen was zum Beispiel die parseDouble() Methode zurück liefert. Ist das der Wert, den du erwartet hast? Wie verhalten sich die if-Abfragen danach?
Gruß
Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

tux_94
Beiträge: 3
Registriert: 16.02.2012, 16:31

Re: Problem mit if

Beitragvon tux_94 » 18.02.2012, 10:22

Hey Jens
Danke für die Antwort.
1.: Wir haben in der Schule einfach sämtliche Fälle abgedeckt. Mit einer Exception den Fall dass keine Zahl eingegeben wird und dann mit den erwähnten Bedingungen alle weiteren möglichen Fälle. Das ist außerdem der Code von meinem Lehrer (er hat ihn selbst geschrieben - da habe ich mich einfach drauf verlassen dass das so in Ordnung ist). Kann man auch mit mehreren if-Bedingungen und dann einmal else arbeiten? Dass man mit if die verschiedenen Fälle nennt und mit else alle anderen Fälle bedient?
2.Genau das habe ich beobachtet. Ich hatte auch (um in dem Fall der Eingabe einer negativen Zahl einen Hinweis anzuzeigen) noch ein Label hunzugefügt, dass ich beim initialisieren ausblenden lassen wollte und erst bei Bedarf sichtbar mache - das wurde nicht angezeigt. Erst als ich über profile das Programm gestartet habe. Ich gehe mal davon aus dass genau das die Lösung sein wird.
3.: Danke für den Link. Das Video sieht ganz gut aus (teilweise wegen dem Rauschen und der geringen Lautstärke etwas schlecht zu verstehen, aber es geht).

Jedenfalls werde ich jetzt erstmal clean and build versuchen (da ich bezweifel dass der Code an der Stelle so extrem fehlerhaft ist).

Nochmals Danke
Sebastian

Nachtrag:
Dankeschön, jetzt funktioniert's. Zumindest der Teil, den ich bis jetzt eingegeben habe.
Und noch eine Frage zum allgemeinen Verständnis: Sollte ich lieber eine extra Methode schreiben, die entscheidet, was passiert und das ganze in eine Exception packen? Oder macht es mehr Sinn alles in genau die Methode mit reinzusetzen? Zwecks der Editierbarkeit wäre ja eine extra Methode sinnvoller, denke ich da richtig?

ebaumann
Beiträge: 284
Registriert: 22.01.2009, 08:53
Wohnort: Würzburg
Kontaktdaten:

Re: Problem mit if

Beitragvon ebaumann » 18.02.2012, 17:29

tux_94 hat geschrieben:Sollte ich lieber eine extra Methode schreiben, die entscheidet, was passiert und das ganze in eine Exception packen? Oder macht es mehr Sinn alles in genau die Methode mit reinzusetzen? Zwecks der Editierbarkeit wäre ja eine extra Methode sinnvoller, denke ich da richtig?


Das ist eine gute Frage und mit deiner Vermutung liegst du richtig: Was sollte den Programmierer eines GUI / einer Eingabe interessieren, welchen Algorithmus eine Quadratwurzelmethode benutzt? Die rhetorische Frage hast du beantwortet: Dem Anwender sollte das im Allgemeinen egal sein. Du definierst in einer Klasse eine Methode, die die Quadratwurzel berechnet. Auch das Werfen einer Exception bei Fehleingaben sollte Pflicht sein: Jede Methode sollte prüfen, ob die überreichten Parameter den "Vertrag" einhalten, hier Zahl >= 0 und andernfalls eine IllegalArgumentException werfen. Alles andere bereitet in der Praxis früher oder später Probleme. Ein weiterer Vorteil ist: Du brauchst im Anschluss in der Methodenimplementierung dich nicht um fehlerhafte Methodenparameter kümmern, der Code ist einfacher zu lesen. Nur mit der Exception hast du die Gewissheit, dass auch ein richtiges Ergebnis geliefert wird. Die Methode könnte so aussehen:

Code: Alles auswählen

public final class Heron {

    /**
     * @param radikand Bedingung: Größer gleich Null (Vertrag)
     * @throws IllegalArgumentException falls radikand < 0
     */
    public static double quadratwurzel(double radikand) (
        if (radikand < 0) {
            throw new IllegalArgumentException("Negativer Radikand: " + radikand);
        }
        if (radikand == 0) {
            return 0;
        } else if (radikand < 1) {
            return quadratWurzelRadikandKleiner1(radikand);
        } else {
            return quadratWurzelRadikandGroesserGleich1(radikand);
        }
    }

    private Heron() {}
}


Das Einlesen sollte nur Werte liefern, die definiert sind, dann kann die Berechnung nicht fehlschlagen. Ein GUI sollte z.B. nur Ziffern annehmen und abhängig von der Locale (konkret: Gepflogenheiten des Lands, Zahlen darzustellen) Kommas und/oder Punkte. Dann tritt der Fall nicht auf, dass der Methode negative Werte überreicht werden oder ein DoubleConverter die Zeichenkette "Fluffy" konvertieren soll.

Bei Swing-TextComponents könnte man dazu einen DocumentFilter benutzen, außerdem einen InputVerifier und ein FormattedTextField, das liefert gleich einen Double-Wert, falls entsprechend initialisiert. Ich finde, bevor man ein GUI benutzt, sollte man die oben dargestellten Prinzipien praktizieren, insbesondere "sauberen" Code und "Eingangsparameter-Vertragsüberprüfung" durch Methoden, denn gute GUI-Programmierung ist sehr komplex.

Ohne GUI sähe der Code so aus:

Code: Alles auswählen

try {
    double radikand = liesRadikand();
    double wurzel = Heron.quadratwurzel(radikand);
} catch (IllegalArgumentException ex) {
    Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
    melde("Fehler: " + ex.getLocalizedMessage());
}


Zurück zu „Java - Tutorials“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast