Java упражнение для начинающих с методами - PullRequest
0 голосов
/ 06 февраля 2020

Я настоящий новичок в Java, и у меня есть одно простое упражнение, в котором мне нужно преобразовать м / ч в км / ч, используя метод и возврат из него.

Мне нужно определить 2 ситуации: если км / ч <0, возврат -1 (ошибка) и если км / ч> 0, возврат км / ч * 1.609 (значение в м / ч).

Я перепробовал все, что мог придумать, но я либо получаю сообщение об ошибке без возврата, либо ничего не получаю, когда пытаюсь его запустить.

Я не могу понять почему, даже если бы дал больше чем один вариант возврата, он просто не работает, независимо от значения. Я мог бы использовать System.outprintln или String, но в упражнении указано, что я должен использовать метод return.

вот мой код, написанный на 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.
    }

}

Ответы [ 5 ]

1 голос
/ 06 февраля 2020

Попробуйте так:

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

Вы также можете вызвать исключение, если скорость отрицательна:

public static double toMilesPerHour(double kilometersPerHour) {
    if (kilometersPerHour < 0) throw new IllegalArgumentException("speed cannot be negative");
    return kilometersPerHour*1.609; 
}
1 голос
/ 06 февраля 2020
public static double toMilesPerHour(double kilometersPerHour) {

    if (kilometersPerHour < 0) {
        return -1;
    }
    else {
        return kilometersPerHour * 1.609;
    }
}
0 голосов
/ 06 февраля 2020

Причина, по которой компилятор выдает ошибку «нет возврата», заключается в том, что вы не охватили все возможные случаи с помощью ifs: есть Double.NaN, который не равен 0 (или любому другому значению, в этом отношении, включая самого себя), и ни больше, ни меньше, чем 0.

Кроме того, компилятор не анализирует ваш код достаточно глубоко, чтобы проверить, охватили ли вы все возможные варианты в любом случае: если вы замените double с long результат тот же - компилятор увидит достижимую ветвь, которая ничего не возвращает, и выдает ошибку. Чтобы исправить ошибку, вам нужно, чтобы все ветви возвращали что-то:

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 голосов
/ 06 февраля 2020

Если вы используете if () ... иначе у вас есть ровно две опции. Либо вы go в предложении if и делаете то, что там, либо вы go в предложении else. Если if-clause и else-clause имеют оператор return, все идет хорошо.

Но у вас нет выражений if-else! У вас есть предложения if-else-if-! Если предложение if не выполняется, вы go переходите к предложению else, в котором снова есть предложение if и т. Д. Наконец, у вас нет предложения else по умолчанию .... если вы не попадаете в первое предложение if, вы проверяете предложение else, если условие выполняется. Если нет, вы проверяете условие в следующем предложении else. Последний оператор return в конце является предложением по умолчанию. Все мы, как люди, видим, что каждое условие (<, ==>) покрыто, но компилятор этого не видит!

0 голосов
/ 06 февраля 2020

Даже если вы используете метод, вы должны напечатать возвращаемое значение:

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.
    }
}

Кроме того, вы можете избавиться от оператора return в конце:

    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;
        }
    }
...