Cheaper: return

Hi ich hab einen fehler gemacht den ich nicht nachvollziehen kann.

Ich hab einen einfachen quelltext, der erst eine Funktion aufruft, die testet ob eine variable ( double ) positiv oder negativ ist.
die rüchgabe ist dann ein string..

quelltext:

public class ReturnTry {

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

posOrNeg(5.122);

}

static String posOrNeg( double d )
 {
   if ( d >= 0 )
     return "pos";
   if ( d < 0 )
     return "neg";
 }

}

eclipse sagt mir ich müsste die Rückgabe der Funktion mit void deklarieren. Aber ich gebe doch einen string zurück?!

MfG Cheaper

  1. Hallo,

    static String posOrNeg( double d )
    {
       if ( d >= 0 )
         return "pos";
       if ( d < 0 )
         return "neg";
    }

    Das (eigentliche) Problem ist, daß nicht jeder Ausführpfad zu einem
    return führt. Damit der Quellcode im Java-Sinne korrekt ist, muß bei
    einer Methode, die einen Wert zurückliefert, jeder Ausführpfad in einem
    return enden.

    Jetzt wirst du sagen: "Klar führt jeder Ausführpfad zu einem return.
    Es gibt ja nur die Möglichkeit, daß d >= 0 oder d < 0 ist."

    Das siehst du als Mensch schon. Eclipse ist aber offenbar hier nicht
    schlau genug, dies auch zu sehen. Es sieht nur 2 Bedingungen, die
    scheinbar unabhängig voneinander sind. Die eine gibt einen Wert zurück.
    Die andere gibt einen Wert zurück. Was aber, wenn beide Bedingungen
    nicht erfüllt sind? Dann würde ja gar kein Wert zurückgegeben werden.
    Also wird der genannte Fehler angezeigt.

    Eclipse weiß nicht, daß mit den Abfragen schon alle Bedingungen
    hinreichend erfüllt sind, und eine der beiden Bedingungen erfüllt sein
    _muß_. Das ist zu viel für die statische Code-Analyse. Daran scheitert
    sie bereits.

    Ändere deinen Code z.B. so:

    if ( d >= 0 )
         return "pos";
       else
         return "neg";

    Dann sieht auch die statische Code-Analyse, daß entweder die eine oder
    die andere Bedingung erfüllt ist, und daß beide jeweils einen Wert
    zurückliefern. Und schon ist sie glücklich.
    Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
    anfällig. :-)

    Gruß
    Slyh

    1. Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
      anfällig. :-)

      Danke....

    2. Hi,

      if ( d >= 0 )
           return "pos";
         else
           return "neg";
      Dann sieht auch die statische Code-Analyse, daß entweder die eine oder
      die andere Bedingung erfüllt ist,

      noch deutlicher wird es, wenn nur das "if" da ist und anschließend schlicht und ergreifend ein "return" folgt. Obigen Code erkennt Eclipse zwar, wird aber (je nach Einstellung) eine Warnung anzeigen.

      Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
      anfällig. :-)

      Und effizienter :-)

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hallo,

        Obigen Code erkennt Eclipse zwar, wird aber (je nach Einstellung) eine Warnung anzeigen.

        Stimmt. Ist aber keine Standardeinstellung, glaube ich. Trotzdem sollte
        man die Option (Java->Compiler->Errors/Warnings->Unnecessary 'else' statement)
        einschalten. Man lernt doch einiges dabei. :)

        Überhaupt habe ich nur 5 Warnings in Eclipse überhaupt ausgeschaltet.
        Und 2 davon beziehen sich auf Generic Types. Die schalte ich in den
        Projekten, die Java ab Version 5 verwenden, wieder projekt-spezifisch
        ein.

        Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
        anfällig. :-)

        Und effizienter :-)

        Hängt davon ab wie schlau der JIT ist. Aber im Grunde ja. :-)

        Gruß
        Slyh

        1. Hi,

          Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
          anfällig. :-)
          Und effizienter :-)
          Hängt davon ab wie schlau der JIT ist. Aber im Grunde ja. :-)

          wenn er schlau genug ist, sind die Eclipse-Entwickler hoffentlich schlau genug, ihn in die Code-Analyse zu integrieren ;-)

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
    3. Hi,

      if ( d >= 0 )
           return "pos";
         if ( d < 0 )
           return "neg";
      Jetzt wirst du sagen: "Klar führt jeder Ausführpfad zu einem return.
      Es gibt ja nur die Möglichkeit, daß d >= 0 oder d < 0 ist."

      Wirklich? Ist NaN >= 0 oder < 0? Oder weder noch?

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.