Можно ли использовать оператор return в void методе

Оператор return в Java

Вступление

Как мы знаем, язык Java является объектно-ориентированным языком программирования. То есть базовая концепция, т.к. сказать основа основ, заключается в том, что всё есть объект. Объекты описываются при помощи классов. Оператор return в Java - 1В свою очередь у классов есть состояние и поведение. Например, банковский счёт может иметь состояние в виде количестве денег на счету и иметь поведения увеличение и уменьшение баланса. Поведение в Java реализуется при помощи методов. То, каким образом описывать методы, приводится в самом начале пути изучения Java. Например, в официальном tutorial от Oracle: «Defining Methods». Тут можно выделить два важных аспекта:

  • Каждый метод имеет сигнатуру. Сигнатура состоит из имени метода и его входных параметров;
  • Для методов должно быть указан тип возвращаемого значения (return type);
  • Тип возвращаемого значения не входит в сигнатуру метода.

Опять же, это следствие того, что Java язык строго типизированный и компилятор хочет заранее понимать, какие типы и где используются на столько, на сколько это возможно. Опять же, чтобы уберечь нас от ошибок. В общем, всё во благо. Ну и нам это лишний раз прививает культуру обращения с данными, как мне кажется. Итак, для методов указывается тип значения. А чтобы вернуть это самое значение из методов используется ключевое слово return.

Ключевое слово оператор return в Java

Ключевое слово оператор return относится к выражениям «управления ходом выполнения», о чём указано в oracle tutorial «Control Flow ements». О том, как нужно возвращать значения можно так же прочитать в официальном tutorial: «Returning a Value from a Method». Компилятор тщательно следит, на сколько у него хватает сил, за тем, чтобы возвращаемое из метода значение соответствовало указанному у метода типу возвращаемого значения. Воспользуемся для примера Online IDE от tutorialspoint. Посмотрим на изначальный пример:

public class HelloWorld { public ic void main(String []args) { System.out.ln(«Hello World»); } }

Как мы видим, здесь выполняется main метод, который является точкой входа в программу. Строчки кода выполняются сверху вниз. Наш main метод не может возвращать значения, иначе мы получим ошибку: «Error: Main method must return a value of type void». Поэтому, метод просто выполнит вывод на экран. Давайте теперь вынесем получение строки в отдельный метод получения сообщения:

public class HelloWorld { public ic void main(String []args) { System.out.ln(getHelloMessage()); } public ic String getHelloMessage() { return «Hello World»; } }

Как мы видим, при помощи ключевого слова return мы указали возвращаемое значение, которое использовали далее в методе ln. В описании (определении) метода getHelloMessage мы указали, что он вернёт нам String. Это позволяет компилятору проверить, что действия метода согласуются с тем, каким образом он объявлен. Естественно, тип возвращаемого значения, указанного в определении метода, может быть более широким чем тип возвращаемого из кода значения, т.е. главное чтобы типы приводились друг к другу. В противном случае мы получим ошибку во время компиляции: «error: incompatible types». Кстати, наверно сразу появился вопрос: Почему return относится к операторам управления ходом выполнения программы. А потому, что он может нарушать обычный ход выполнения программы «сверху вниз». Например:

public class HelloWorld { public ic void main(String []args){ if (args.length == 0) { return; } for (String arg : args) { System.out.ln(arg); } } }

Как видно из примера, мы прерываем выполнение метода main в том случае, если java программа наша вызвана без параметров. Важно помнить, что если у вас после return есть код, он становится недоступным. И это заметит наш умный компилятор и не даст вам запустить такую программу. Например, данный код не скомпилируется:

public ic void main(String []args) { System.out.ln(«1»); return; System.out.ln(«2»); }

Есть один «грязный хак» для обхода такого. Например, для целей отладки или ещё почему-то. Выше указанный код можно починить обернув return в if блок:

if (2==2) { return; }

Оператор Return при обработке ошибок

Есть одно очень хитрое обстоятельство — мы можем использовать return совместно с обработкой ошибок. Сразу хочется сказать, что использование return в catch блоке это очень и очень плохой тон, поэтому стоит этого избегать. Но нам ведь нужен пример? Вот он:

public class HelloWorld { public ic void main(String []args) { System.out.ln(«Value is: » + getIntValue()); } public ic int getIntValue() { int value = 1; try { System.out.ln(«Something terrible happens»); throw new Exception(); } catch (Exception e) { System.out.ln(«Catched value: » + value); return value; } finally { value++; System.out.ln(«New value: » + value); } } }

На первый взгляд кажется, что должно вернуться 2, ведь finally выполняется всегда. Но нет, значение будет 1, а изменение переменной в finally будет проигнорировано. Более того, если бы value содержала бы объект и мы в finally сказали бы value = null, то из catch вернулась бы всё равно ссылка на объект, а не null. А вот из блока finally оператор return сработал бы правильно. Коллеги за такой подарок явно не скажут спасибо.

Читайте также:  Можно ли использовать сухие сливки для соуса

void.class

Ну и напоследок. Можно написать странную конструкцию вида void.class. Казалось бы, зачем и в чём смысл? На самом деле, в различных фрэймворках и хитрых случаях, когда используется Java Reflection API, это может очень понадобится. Например, можно проверять, какой тип возвращает метод:

import java.lang.reflect.Method; public class HelloWorld { public void getVoidValue() { } public ic void main(String[] args) { for (Method method : HelloWorld.class.getDeclaredMethods()) { System.out.ln(method.getReturnType() == void.class); } } }

Это может быть полезно в тестовых фрэймворках, где необходимо подменять реальный код методов. Но для этого нужно понимать, как этот метод себя ведёт (т.е. какие типы возвращает). Есть ещё второй способ реализации метода main из кода выше:

public ic void main (String[] args) { for (Method method : HelloWorld.class.getDeclaredMethods()) { System.out.ln(method.getReturnType() == Void.TYPE); } }

Довольно интересное обсуждение разницы между ними можно прочитать на stackoverflow: What is the difference between java.lang.Void and void? #Viacheslav

Источник

Результат функции

Можно ли использовать оператор return в void методе

Можно ли использовать оператор return в void методе

1. Оператор return

Думаете вы уже выучили все про методы в Java? Как бы не так, вы еще и половины не знаете.

Начнем с чего-нибудь простого. Например, в Java есть команда (оператор) return, позволяющий мгновенно завершить метод, в котором он был вызван. Внешний вид команды:

Все: просто одно слово return и точка с запятой. Как только программа выполнит эту команду, работа текущего метода тут же завершится, и продолжится работа вызвавшего метода.

Если return вызвать в методе main, метод main тут же завершится, а вместе с ним и вся программа.

Пример:

class Solution { public ic void fill(int[] data, int from, int to, int value) { if (from < 0 || to > data.length) return; for (int i = from; i < to; i++) { data[i] = value; } } public ic void main(String[] args) { int[] months = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10, 11, 12}; fill(months, 2, 10, 8); } }

Метод fill заполняет часть переданного массива значением value.

Часть массива определяется индексами from и to.

Если from меньше 0 или to больше длины массива, метод тут же завершается.

В приведенной выше программе есть метод fill, который заполняет переданный в него массив значением value, причем заполняет не весь массив, а его часть, заданную индексами from и to.

В начале метода fill проверяется, корректно ли переданы в него значения. Если from меньше 0, или to больше длины массива, то метод fill тут же завершается (вызывает команду return).

Полезная вещь этот оператор return: есть практически в каждом методе в Java, и вот почему.

2. Функции с результатом, void

Помните, мы когда-то разбирали, что есть команды, а есть выражения. И выражение, в отличие от команды, имеет значение, которое можно использовать где-нибудь.

Так вот, в Java методы могут иметь значение. И это очень хорошая новость: методы могут не просто что-то делать в зависимости от параметров, но и, например, вычислить что-нибудь и вернуть результат вычисления.

Вы, кстати, с такими методами уже сталкивались:

double delta = Math.abs(d1 — d2);Метод abs() возвращает значение типа double
Scanner console = new Scanner(System.in); int x = console.nextInt();

Метод nextInt() возвращает значение типа int

String str = «Привет»; String s2 = str.toUpperCase();

Метод toUpperCase() возвращает значение типа String

int[] data = {1, 4, 5, 6, 7, 8, 11}; int[] array = Arrays.copyOf(data, 4);

Метод copyOf() возвращает значение типа int[]

Каждый метод может вернуть только одно значение и одного заранее заданного типа. Тип возвращаемого значения определяется при объявлении метода:

public ic тип имя(параметры) { код метода }

Где имя — это имя метода, параметры — список параметров метода, а тип — тип результата, который возвращает метод.

Для методов, которые ничего не возвращают, есть специальный тип-заглушка — void.

Пишете свой метод и не хотите ничего возвращать вызывающему методу? Просто объявите тип метода void, и проблема решена. Таких методов в Java тоже много.

3. Возвращение результата

Как объявлять метод с результатом вычисления/работы мы только что разобрались, а как же этот результат вернуть из самого метода?

Для этого нам снова пригодится оператор return. Передача результата из метода будет выглядеть так:

Где return — это оператор, который немедленно завершит работу метода. А значение — это значение, которое должен вернуть метод вызывающему методу в качестве результата. Тип значения обязан совпадать с типом, указанным при объявлении метода.

Пример 1. Метод вычисляет минимум из двух чисел:

int min(int a, int b) { if (a < b) return a; else return b; }Метод возвращает минимум из двух чисел.

Если a < b

вернуть a

Иначе

вернуть b

Пример 2. Метод дублирует переданную в него строку n раз:

String multiple(String str, int s) { String result = «»; for (int i = 0; i < s; i++) result = result + » «+ str; return result; }Метод принимает два параметра — строку и количество ее повторений.

Создается пустая строка для будущего результата.

В цикле s раз

к строке result добавляется пробел и строка str.

В качестве результата метода возвращается переменная result.

Пример 3: Метод вычисляет максимум из двух чисел с помощью тернарного оператора:

int max(int a, int b) { return (a > b ? a : b); }Метод возвращает максимум из двух чисел.

вернуть (если a > b, то a, иначе b)

Источник

What does the return keyword do in a void method in Java?

I’m looking at a path finding tutorial and I noticed a return ement inside a void method (class PathTest, line 126):

if ((x < 0) || (y < 0) || (x >= map.getWidthInTiles()) || (y >= map.getHeightInTiles())) { return; }

I’m a novice at Java. Can anyone tell me why it’s there? As far as I knew, return inside a void method isn’t allowed.

Boann

44.7k1313 gold badges105105 silver badges136136 bronze badges

asked Apr 13 ’09 at 17:27

RelequestualRelequestual

8,90166 gold badges3939 silver badges7474 bronze badges

It just exits the method at that point. Once return is executed, the rest of the code won’t be executed.

eg.

public void test(int n) { if (n == 1) { return; } else if (n == 2) { doStuff(); return; } doOtherStuff(); }

Note that the compiler is smart enough to tell you some code cannot be reached:

if (n == 3) { return; youWillGetAnError(); //compiler error here }

answered Apr 13 ’09 at 17:30

CookieOfFortuneCookieOfFortune

13k88 gold badges3636 silver badges5656 bronze badges

4

You can have return in a void method, you just can’t return any value (as in return 5;), that’s why they call it a void method. Some people always explicitly end void methods with a return ement, but it’s not mandatory. It can be used to leave a early, though:

void someFunct(int arg) { if (arg == 0) { //Leave because this is a bad value return; } //Otherwise, do something }

KBoek

4,59933 gold badges2828 silver badges4343 bronze badges

answered Apr 13 ’09 at 17:32

PestoPesto

23.3k22 gold badges6767 silver badges7676 bronze badges

The keyword simply pops a frame from the call stack returning the control to the line following the call.

answered Apr 13 ’09 at 17:36

MahdeToMahdeTo

10.2k11 gold badge2424 silver badges2727 bronze badges

3

The Java language specification says you can have return with no expression if your method returns void.

answered Apr 13 ’09 at 17:32

John EllinwoodJohn Ellinwood

13.5k77 gold badges3636 silver badges4848 bronze badges

It exits the and returns nothing.

Something like return 1; would be incorrect since it returns integer 1.

answered Apr 13 ’09 at 17:33

AlbertAlbert

50822 gold badges77 silver badges1616 bronze badges

It s the same as a return for with a specified parameter, except it returns nothing, as there is nothing to return and control is passed back to the calling method.

answered Apr 13 ’09 at 17:33

Chris BallanceChris Ballance

32k2525 gold badges101101 silver badges147147 bronze badges

See this example, you want to add to the list conditionally. Without the word «return», all ifs will be executed and add to the ArrayList!

Arraylist<String> list = new ArrayList<>(); public void addingToTheList() { if(isSunday()) { list.add(«Pray today») return; } if(isMonday()) { list.add(«Work today» return; } if(isTuesday()) { list.add(«Tr today») return; } }

GreyGoose

57044 silver badges1212 bronze badges

answered Nov 26 ’15 at 3:53

iali87iali87

12588 bronze badges

1

Not the answer you’re looking for? Browse other questions tagged java methods return void or ask your own question.

Источник

Return statement in void method

I have the following method that returns void and I need to use it in another method that also returns void. Can I do the following?

public void doSomething(){} public void myMethod() { return doSomething(); }

Thanks for all your s, but let me be more specific

I only doSomething if something happens, otherwise I do other things

public void doSomething(){} public void myMethod() { for(…) if(somethingHappens) { doSomething(); return; } doOtherStuff(); }

Instead of the code above, can I just write return doSomething(); inside the if ement?

dsh

11.4k33 gold badges2727 silver badges4747 bronze badges

asked Jun 11 ’12 at 23:45

monicamonica

37222 gold badges66 silver badges1717 bronze badges

3

No, just do this:

public void doSomething() { } public void myMethod() { doSomething(); }

or in the second case:

public void doSomething() { } public void myMethod() { // … if (somethingHappens) { doSomething(); return; } // … }

«Returning void» means returning nothing. If you would like to «jump» out of myMethod’s body, use return; The compiler does not allow writing return void; («illegal start of expression») or return doSomething(); («cannot return a value from method whose result type is void»). I understand it seems logical to return «void» or the «void result» of a method call, but such a code would be misleading. I mean most programmers who read something like return doSomething(); would think there is something to return.

answered Jun 11 ’12 at 23:46

kolkol

24.3k1111 gold badges7070 silver badges103103 bronze badges

1

void s don’t/can’t return anything as such. Simply call the .

Peter DeWeese

17.6k88 gold badges7575 silver badges9898 bronze badges

answered Jun 11 ’12 at 23:47

Samy VilarSamy Vilar

9,37011 gold badge3232 silver badges3333 bronze badges

No, returns are unnecessary in Java void e. Instead, do this:

public void myMethod(){ doSomething(); }

You could put a return after doSomething() if you wanted, but as I said it’d be unnecessary.

answered Jun 11 ’12 at 23:48

MattSMattS

70522 gold badges77 silver badges2020 bronze badges

You either have to just use doSoemthing like the others have pointed out OR

public (insert data type like int, double, string, etc) myMethod() { return doSomething(); }

If do something returns an int

// if you wanted to take 2 numbers and add them public void myMethod() { valueOfX+Y = doSomething(); } public int doSomething() { x = 2; y = 2; return X+Y; }

hope that clears it up

answered Jun 12 ’12 at 0:15

Matt WestlakeMatt Westlake

3,06955 gold badges3030 silver badges7474 bronze badges

If

  • the condition (somethingHappens) actually depends on what doSomething() did
  • and doSomething() is a method you can modify

then you should consider making it return the boolean (or any suitable type) value which tells the callee method if it happened or not.

Code would then look somewhat like this:

public boolean doSomething() { // internal working if (internalCondition) { // something done here return true; } // not done ; return false; } public void myMethod() { for(…) if (doSomething()) { return; } // didn’t hit ‘doSomething() == true’ doOtherStuff(); }

answered Jul 18 ’15 at 7:54

Not the answer you’re looking for? Browse other questions tagged java or ask your own question.

Источник

В чем отличие void от return на примере?

Вот пример кода, который из void выводит значение в main() и присваивает переменно «c» значение. Объясните отличие от return тогда. Только по-простому аля 2 + 2, чтобы такие примеры не сбивали с толку. Спасибо.

pastebin.com/SZkNuMgi

  • Вопрос задан более трёх лет назад
  • 5654 просмотра

Пригласить эксперта

Мда, вопрос вы конечно написали коряво, что мозг сломать можно. Если я вас правильно понял, то вам не ясно, почему в переменной «с» оказывается значение при том что return вы не использовали. Дело в том, что в данном случае ваша «с» это поле класса, которой вы присваиваете значение в методе getJazz, return тут совсем не нужен, потому что метод ничего не возвращает, он манипулирует полями, которые принадлежат к классу. Если бы вы захотели написать так int b = getJazz() тогда бы пришлось писать return.

Может быть вы начнете с чего-нибудь типа Pascal, разберетесь что такое процедуры и чем он отличаются от функций и уже потом, постепенно начнете разбираться с Java и ООП?

Вспоминается анекдот:

Летят 2 крокодила, один зеленый, другой направо.

Суть в том, что ‘void’ лишь одначает, что данный метод не возвращает никакой переменной, а return — это операция именно возврата значения.

‘c’ в вашем случае — это свойство объекта, а не возвращаемое значение, а внутри метода вы присваиваете, а не возвращаете, значение именно свойству объекта

ты своим void методом просто записываешь значение переменной «c», а потом просто выводишь её на экран. Если бы метод был бы такого вида:

int getJazz(int a, int b){ return c = a + b; }

то можно было бы получить переменную «c» из этого метода, т.е обращаясь System.out.ln(nn.getJazz(12,12);

Если бы переменная «c» имела бы модификатор доступа private, то ты не смог бы обратиться к ней так, как в твоем примере.

Попробую пояснить на пальцах. Возьмем твой пример.

public class Main{ public ic void main(String[] args){ Jazz nn = new Jazz(); nn.getJazz(12, 12); // вызов void метода, который записывает в «c» число 24 nn.c = 51; // я могу здесь присвоить «c» другое значение, например 51 System.out.ln(nn.c); // Выводим переменную «c» которая равна 51, а не 24 } }

Какое значение из void?

Ты же вызываешь просто:

nn.GetJazz(12,12);

и только потом уже, следующим оператором печатаешь поле nn.c

Первая строчка просто вызывает метод (в данном случае — процедуру), который ничего не возвращает (т.е. «возвращает» void)

А второй строчкой ты смотришь содержимое поля c у своего класса.

Это РАЗНЫЕ строки; между собой никак не связанные!

Убери у себя c=a+b и оставь просто a+b — и всё, выведется лишь сумма изнутри метода.

Ровно так же ты можешь написать и

sin(c=a+b)

Это будет означать, что сперва вычислится сумма a+b, её значение будет присвоено c и одновременно возвращено как значение выражения с=a+b.

От значения этого выражения будет взят синус. Но он никуда не будет присвоен; просто займёт проц вычислениями, а результат будет выброшен.

В результате ты так же получишь значение c. Однако значение синуса — нет :).

26 апр. 2021, в 11:57

200 руб./в час

26 апр. 2021, в 11:46

3000 руб./за проект

26 апр. 2021, в 11:25

33000 руб./за проект

Источник

Читайте также:  Можно ли металлическую прокладку гбц использовать второй раз