Finde den Fehler nicht, Problem mit if-Anweisung im Catch Block



  • // .... Weiter oben wird dem String hostname ein String zugewiesen
      //
      // Erzeuge Socket
      Socket socket = null;
      try
      {
        // Aufbau der Verbindung
        socket = new Socket (hostname, 4200);
      }
      catch (IOException e)
      {
        if (hostname  != "" || hostname != null )
        { // 1. Teil der If-Abfrage
          System.out.println("Server "+hostname+" nicht erreichbar.\n";
        }
        else
        { // 2. Teil der If-Abfrage
          System.out.println("Kein Hostname angegeben.");
        }
        return true;
      }
    

    Mein Problem ist jetzt, daß sobald eine Exception geworfen wird
    immer nur der erste Teil der If Abfrage behandelt UND ausgegeben wird,
    ganz ganz egal ob die Variable hostname einen leeren String enthält (also so etwas: "")
    oder auf eine null Referenz zeigt.
    Oder anders gesagt, egal ob die If Anweisung wahr oder falsch ist, sie
    wird immer ausgeführt.

    Normalerweise müßte er nur den Befehl im 2. Teil der If Abfrage behandeln
    und den Text "Kein Hostname angegeben" ausgeben
    wenn die Variable Hostname keinen oder einen leeren String enthält,
    das passiert aber nicht, stattdessen wird grundsätzlich der 1. Teil ausgegeben.

    Wo liegt der Fehler?



    1. Es wäre sinnvoller zuerst auf null abzufragen
    2. Stringvergleiche mit '==' oder '!=' geht nicht. Dafür musst du equals nehmen


  • Danke, daran lag es jetzt funktionierts. 🙂

    Das mit stringname.equals(NULL) bzw. stringname.equals("") vergesse ich jedesmal. 😞
    Ich glaub ich schreib mir das jetzt einmal an die Wand.



  • Dürfte mit equals auch nicht funktionieren, der logische Operator stimmt nämlich nicht. a || b ist bekanntlich dann wahr, wenn a oder b wahr sind. Im Umkehrschluss ist a || b also genau dann falsch, wenn sowohl a als auch b falsch sind. Gucken wir uns das mal an: a ist hostname ungleich Leerstring. Diese Bedingung ist nur dann falsch, wenn a der Leerstring ist. In dem Moment ist aber automatisch die zweite Bedingung, a != null, wahr. Wenn also das Nichtzutreffen der ersten Bedingung das Zutreffen der zweiten Bedingung impliziert, ist a || b immer wahr.

    Der && Operator würde sich dagegen anbieten. Ausserdem sollte die Reihenfolge vertauscht werden, da bei hostname == null sonst beim equals-Aufruf eine NullPointerException geworfen wird.


Anmelden zum Antworten