Я знаю, что метод void
не возвращает никакого значения, но я все еще могу написать код типа
void nothingDohere() {return;}
Итак, как можно "void" работать с инструкцией "return" здесь?
Я знаю, что метод void
не возвращает никакого значения, но я все еще могу написать код типа
void nothingDohere() {return;}
Итак, как можно "void" работать с инструкцией "return" здесь?
Оператор return без значения может использоваться только в методе void
(или конструкторе) и просто выполняет часть "get from the method now". Представьте, что оператор return-value имеет две цели:
finally
блоков, конечно)Оператор return в методе void
просто достигает первого из них; второй не имеет смысла в методе void
.
Из раздела 14.17 Спецификации языка Java:
Оператор return без выражения должен содержаться в теле метода, объявленного с использованием ключевого слова void, а не для возврата какого-либо значения (§8.4) или в тело конструктора (§8.8). Ошибка времени компиляции возникает, если оператор возврата появляется внутри инициализатора экземпляра или статического инициализатора (§8.7). Оператор return без Expression пытается передать управление вызывающему методу или конструктору, который его содержит. Если быть точным, оператор return без Expression всегда завершается внезапно, причина - возврат без значения.
У вашего оператора возврата нет аргументов, поэтому он ничего не возвращает, поэтому возвращаемое значение является "void".
В любой момент в методе, когда выполняется оператор return, он просто выходит из метода. Возвращаемое здесь просто заканчивает выполнение вашего метода здесь.
Если вы попытаетесь что-то (некоторое значение) из метода void, например, return"xzy";
Вы получите сообщение об ошибке - Void methods cannot return a value
Оператор return
также может использоваться, чтобы заставить выполнение вернуться к вызывающей стороне этого метода. Таким образом, оператор return немедленно прекращает метод, в котором он выполняется.
Поэтому ваш пример кода:
void nothingDohere() {
return ;
}
Завершает вызов метода и немедленно возвращается обратно вызывающему устройству метода.
В упомянутом вами случае возвращение действительно семантически избыточно (хотя это и требуется синтаксически - Javac не будет компилироваться без этого возврата). Возврат завершает метод.
Однако в некоторых случаях желательно иметь несколько выходных выводов в методе, например. например:
public void doDifferentThings(){
if(){
//something done
return;
}
else{
//something else done
return;
}
}
Некоторые считают, что этот плохой дизайн (противоречит одноточечной точке выхода), однако он может сохранить ваш код чище.
Просто он возвращается изнутри метода void в положение, в котором программа вызывает этот метод:
public calss Test
{
private boolean flag = true;
public Test()
{
... // (1)
... // (2)
voidMethod(); // (3)
... // (7)
... // (8)
}
private void voidMethod()
{
... // (4)
... // (5)
if(flag) return; // (6)
...
...
}
}
Когда вы возвращаетесь из функции, вы возвращаете элемент управления функции, вызывающей возвращаемую функцию. Если вы вернете значение, вызывающая функция получит это значение, иначе вызывающая функция получит только элемент управления.