Ich bin ein echter Anfänger in Java und ich habe eine einfache Übung, bei der ich m / h mit einer Methode in km / h umwandeln und daraus zurückkehren muss.

Ich muss 2 Situationen definieren: Wenn km / h <0 -1 (Fehler) zurückgeben und wenn km / h> 0 km / h * 1,609 (Wert in m / h) zurückgeben.

Ich habe alles versucht, was mir einfiel, aber ich erhalte entweder einen Fehler ohne Rückgabe oder keine Ausgabe, wenn ich versuche, es auszuführen.

Ich kann nicht verstehen, warum es nicht funktioniert, selbst wenn ich mehr als eine Rückgabeoption angegeben habe, unabhängig vom Wert. Ich könnte System.outprintln oder String verwenden, aber in der Übung wird angegeben, dass ich eine Rückgabemethode verwenden muss.

Hier ist mein Code, geschrieben in IntelliJ:

package EXERCISE;

public class Main {

    public static void main(String[] args) {
        toMilesPerHour(0);
    }

    public static double toMilesPerHour(double kilometersPerHour) {

        if (kilometersPerHour < 0) {
            return -1;
        }
        else if (kilometersPerHour > 0) {
            return kilometersPerHour * 1.609d;
        }
        else if (kilometersPerHour == 0) {
            return 0;
        }

        return kilometersPerHour * 1.609;

        // if I don't write return here it gives me no return statement error,
        // if I write it, it gives me no output with value > or < 0 but no error.
    }

}
0
Matteo Scalas 6 Feb. 2020 im 21:13

5 Antworten

Beste Antwort

Auch wenn Sie eine Methode verwenden, müssen Sie den zurückgegebenen Wert drucken:

package EXERCISE;

public class Main {

    public static void main(String[] args) {

        System.out.println(toMilesPerHour(0));

    }

    public static double toMilesPerHour(double kilometersPerHour) {

        if (kilometersPerHour < 0) {
            return -1;
        }
        else if (kilometersPerHour > 0) {
            return kilometersPerHour * 1.609d;
        }
        else if (kilometersPerHour == 0) {
            return 0;
        }
        return kilometersPerHour * 1.609;
        //if I don't write return here it gives me no return statement error,
        //if I write it, it gives me no output with value > or < 0 but no error.
    }
}

Außerdem können Sie die return-Anweisung am Ende entfernen:

    public static double toMilesPerHour(double kilometersPerHour) {
        if (kilometersPerHour < 0) {
            return -1;
        }
        else {
            // you don't need to check if kilometersPerHour is 0, since every number multiplied with 0 is 0
            return kilometersPerHour * 1.609;
        }
    }
0
DasElias 6 Feb. 2020 im 18:18

Der Grund, warum der Compiler den Fehler "Keine Rückgabeanweisung" ausgibt, ist, dass Sie nicht alle möglichen Fälle mit Ihrem ifs abgedeckt haben: Es gibt Double.NaN, das nicht gleich 0 (oder einem anderen) ist anderer Wert, einschließlich sich selbst) und weder größer noch kleiner als 0.

Außerdem analysiert der Compiler Ihren Code nicht tief genug, um zu überprüfen, ob Sie ohnehin alle möglichen Varianten abgedeckt haben: Wenn Sie double durch long ersetzen, ist das Ergebnis dasselbe - der Compiler sieht den erreichbaren Zweig, der gibt nichts zurück und erzeugt daher einen Fehler. Um einen Fehler zu beheben, müssen alle Zweige etwas zurückgeben:

if (kilometersPerHour < 0) {
    return -1;
}
else if (kilometersPerHour == 0) {
    return 0;
}

// Note: I don't have explicit check for NaN,
// because any arithmetic on NaN produces NaN,
// which would be the correct result for this function.
// So I let the "*" operator to check for NaN instead.
return kilometersPerHour * 1.609;

0
M. Prokhorov 6 Feb. 2020 im 18:35
public static double toMilesPerHour(double kilometersPerHour) {

    if (kilometersPerHour < 0) {
        return -1;
    }
    else {
        return kilometersPerHour * 1.609;
    }
}
1
Anthony Marino 6 Feb. 2020 im 18:16

Versuchen Sie es wie folgt:

public static double toMilesPerHour(double kilometersPerHour) {
    return (kilometersPerHour > 0 ? kilometersPerHour*1.609 : -1; 
}

Sie können auch eine Ausnahme auslösen, wenn die Geschwindigkeit negativ ist:

public static double toMilesPerHour(double kilometersPerHour) {
    if (kilometersPerHour < 0) throw new IllegalArgumentException("speed cannot be negative");
    return kilometersPerHour*1.609; 
}
1
duffymo 6 Feb. 2020 im 18:16

Wenn Sie if () ... verwenden, haben Sie genau zwei Möglichkeiten. Entweder gehen Sie in die if-Klausel und tun, was dort ist, oder Sie gehen in die else-Klausel. Wenn if-Klausel und else-Klausel beide eine return-Anweisung haben, geht alles gut.

Aber Sie haben keine if-else-Klauseln! Sie haben if-else-if-Klauseln! Wenn die if-Klausel nicht gilt, gehen Sie in die else-Klausel, die wiederum eine if-Klausel enthält, und so weiter. Schließlich haben Sie keine Standard-else-Klausel. Wenn Sie nicht in die erste if-Klausel gelangen, checken Sie die else-Klausel ein, wenn die Bedingung erfüllt ist. Wenn nicht, überprüfen Sie die Bedingung in der nächsten else-Klausel. Die letzte return-Anweisung ist schließlich die Standardklausel else. Wir alle als Menschen sehen, dass jede Bedingung (<, ==>) abgedeckt ist, aber der Compiler sieht das nicht!

0
Jochen 6 Feb. 2020 im 18:27