Методы, в зависимости от того, что нужно автору программы, могут возвращать значение того или иного типа, а могут не возвращать никакого значения. Те, которые вычисляют и возвращают какое-то значение, по смыслу соответствуют математическому понятию функции (типа у = sin(x)), и в некоторых языках так и называются -- функции. Те, которые просто совершают какие-то действия, но не возвращают никакого значения, по смыслу соответствуют тому, что в других языках называется процедуры. Методы первого типа в Java описываются с указанием типа результата и обязаны явно использовать как минимум один оператор return с указанием возвращаемого значения, причем компилятор проверяет, что тот или иной из этих операторов выполнится неизбежно, при любых обстоятельствах (кроме случаев возникновения исключений). Ведь внутри тела метода могут вычисляться несколько разных значений, а компилятор должен знать, какое именно из них должно являться результатом вычисления функции. Например:
public double sqrtOfSinMultByCos(double a, double b) {
double sin = Math.sin(a);
double cos = Math.cos(b);
return Math.sqrt(sin * cos);
}
public int badMethod(int a) { // Не откомпилируется,
// сругается "This method must return a result of type int"
if (a >= 10) {
return a / 10; // оператор return есть,
// но его выполнение не гарантировано:
} else { // В этом случае return не выполнился бы
System.out.println("a меньше 10");
}
}
Методы второго типа, которые просто выполняют какие-то действия и не возвращают никакого значения, описываются с ключевым словом void, которое используется вместо указания типа результата, и не обязаны, но могут иметь явный оператор return. Например:
public void printSqrtOfSinMultByCos(double a, double b) {
double sin = Math.sin(a);
double cos = Math.cos(b);
System.out.println(Math.sqrt(sin * cos));
}
В норме код такого метода выполняется до конца, затем происходит возврат к выполнению того участка кода, который следует за вызовом метода. Если по логике метода код метода не обязан выполняться весь, то можно использовать оператор return в нескольких местах кода, не обязательно в конце. Это может упростить структуру кода и улучшить его читаемость:
// Найти макс. x, x <= 10, на которое делится n
publiс void reportDivisibility(int n) {
if (n % 10 == 0) {
System.out.println("n делится на 10"); return;
}
// Если n делится на 10, другие условия не проверяются
// TODO Добавить проверку других признаков делимости
if (n % 3 == 0) {
System.out.println("n делится на 3"); return;
}
if (n % 2 == 0) {
System.out.println("n -- четное"); return;
}
System.out.println("n не делится на числа 2..10";
}
Этот же прием можно использовать и в методах, возвращающих результат:
public BigDecimal max(BigDecimal a, BigDecimal b) {
if (a.compareTo(b) > 0)
return a;
return b;
}
Здесь return b выполняется только в том случае, если не выполнилось условие оператора if и соответственно не выполнилось return a;.
returnвсе стало понятным. – Alex May 29 '19 at 04:51