return
Cheaper
- java
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
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
Außerdem ist der Code so auch noch besser lesbar und weniger fehler-
anfällig. :-)
Danke....
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
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
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
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