Чтобы функция возвращала java

Branching Statements

The break statement has two forms: labeled and unlabeled. You saw the unlabeled form in the previous discussion of the switch statement. You can also use an unlabeled break to terminate a for , while , or do-while loop, as shown in the following BreakDemo program:

class BreakDemo < public static void main(String[] args) < int[] arrayOfInts = < 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 >; int searchfor = 12; int i; boolean foundIt = false; for (i = 0; i < arrayOfInts.length; i++) < if (arrayOfInts[i] == searchfor) < foundIt = true; break; > > if (foundIt) < System.out.println("Found " + searchfor + " at index " + i); >else < System.out.println(searchfor + " not in the array"); >> >

This program searches for the number 12 in an array. The break statement, shown in boldface, terminates the for loop when that value is found. Control flow then transfers to the statement after the for loop. This program’s output is:

An unlabeled break statement terminates the innermost switch , for , while , or do-while statement, but a labeled break terminates an outer statement. The following program, BreakWithLabelDemo , is similar to the previous program, but uses nested for loops to search for a value in a two-dimensional array. When the value is found, a labeled break terminates the outer for loop (labeled «search»):

class BreakWithLabelDemo < public static void main(String[] args) < int[][] arrayOfInts = < < 32, 87, 3, 589 >, < 12, 1076, 2000, 8 >, < 622, 127, 77, 955 >>; int searchfor = 12; int i; int j = 0; boolean foundIt = false; search: for (i = 0; i < arrayOfInts.length; i++) < for (j = 0; j < arrayOfInts[i].length; j++) < if (arrayOfInts[i][j] == searchfor) < foundIt = true; break search; >> > if (foundIt) < System.out.println("Found " + searchfor + " at " + i + ", " + j); >else < System.out.println(searchfor + " not in the array"); >> >

This is the output of the program.

Читайте также:  Caused by java lang illegalstateexception entitymanagerfactory is closed

The break statement terminates the labeled statement; it does not transfer the flow of control to the label. Control flow is transferred to the statement immediately following the labeled (terminated) statement.

The continue Statement

The continue statement skips the current iteration of a for , while , or do-while loop. The unlabeled form skips to the end of the innermost loop’s body and evaluates the boolean expression that controls the loop. The following program, ContinueDemo , steps through a String , counting the occurrences of the letter «p». If the current character is not a p, the continue statement skips the rest of the loop and proceeds to the next character. If it is a «p», the program increments the letter count.

class ContinueDemo < public static void main(String[] args) < String searchMe = "peter piper picked a " + "peck of pickled peppers"; int max = searchMe.length(); int numPs = 0; for (int i = 0; i < max; i++) < // interested only in p's if (searchMe.charAt(i) != 'p') continue; // process p's numPs++; >System.out.println("Found " + numPs + " p's in the string."); > >

Here is the output of this program:

To see this effect more clearly, try removing the continue statement and recompiling. When you run the program again, the count will be wrong, saying that it found 35 p’s instead of 9.

A labeled continue statement skips the current iteration of an outer loop marked with the given label. The following example program, ContinueWithLabelDemo , uses nested loops to search for a substring within another string. Two nested loops are required: one to iterate over the substring and one to iterate over the string being searched. The following program, ContinueWithLabelDemo , uses the labeled form of continue to skip an iteration in the outer loop.

class ContinueWithLabelDemo < public static void main(String[] args) < String searchMe = "Look for a substring in me"; String substring = "sub"; boolean foundIt = false; int max = searchMe.length() - substring.length(); test: for (int i = 0; i > foundIt = true; break test; > System.out.println(foundIt ? "Found it" : "Didn't find it"); > >

Here is the output from this program.

The return Statement

The last of the branching statements is the return statement. The return statement exits from the current method, and control flow returns to where the method was invoked. The return statement has two forms: one that returns a value, and one that doesn’t. To return a value, simply put the value (or an expression that calculates the value) after the return keyword.

The data type of the returned value must match the type of the method’s declared return value. When a method is declared void , use the form of return that doesn’t return a value.

The Classes and Objects lesson will cover everything you need to know about writing methods.

Источник

Returning a Value from a Method

You declare a method’s return type in its method declaration. Within the body of the method, you use the return statement to return the value.

Any method declared void doesn’t return a value. It does not need to contain a return statement, but it may do so. In such a case, a return statement can be used to branch out of a control flow block and exit the method and is simply used like this:

If you try to return a value from a method that is declared void , you will get a compiler error.

Any method that is not declared void must contain a return statement with a corresponding return value, like this:

The data type of the return value must match the method’s declared return type; you can’t return an integer value from a method declared to return a boolean.

The getArea() method in the Rectangle Rectangle class that was discussed in the sections on objects returns an integer:

// a method for computing the area of the rectangle public int getArea()

This method returns the integer that the expression width*height evaluates to.

The getArea method returns a primitive type. A method can also return a reference type. For example, in a program to manipulate Bicycle objects, we might have a method like this:

public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike, Environment env) < Bicycle fastest; // code to calculate which bike is // faster, given each bike's gear // and cadence and given the // environment (terrain and wind) return fastest; >

Returning a Class or Interface

If this section confuses you, skip it and return to it after you have finished the lesson on interfaces and inheritance.

When a method uses a class name as its return type, such as whosFastest does, the class of the type of the returned object must be either a subclass of, or the exact class of, the return type. Suppose that you have a class hierarchy in which ImaginaryNumber is a subclass of java.lang.Number , which is in turn a subclass of Object , as illustrated in the following figure .

The class hierarchy for ImaginaryNumber

Now suppose that you have a method declared to return a Number :

public Number returnANumber()

The returnANumber method can return an ImaginaryNumber but not an Object . ImaginaryNumber is a Number because it’s a subclass of Number . However, an Object is not necessarily a Number — it could be a String or another type.

You can override a method and define it to return a subclass of the original method, like this:

public ImaginaryNumber returnANumber()

This technique, called covariant return type, means that the return type is allowed to vary in the same direction as the subclass.

Note: You also can use interface names as return types. In this case, the object returned must implement the specified interface.

Источник

Оператор return в Java

Java-университет

Оператор return в Java - 1

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

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

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

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

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

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

 public class HelloWorld < public static void main(String []args) < System.out.println(getHelloMessage()); >public static String getHelloMessage() < return "Hello World"; >> 

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

 public class HelloWorld < public static void main(String []args)< if (args.length == 0) < return; >for (String arg : args) < System.out.println(arg); >> > 

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

 public static void main(String []args)

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

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

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

 public class HelloWorld < public static void main(String []args) < System.out.println("Value is: " + getIntValue()); >public static int getIntValue() < int value = 1; try < System.out.println("Something terrible happens"); throw new Exception(); >catch (Exception e) < System.out.println("Catched value: " + value); return value; >finally < value++; System.out.println("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 static void main(String[] args) < for (Method method : HelloWorld.class.getDeclaredMethods()) < System.out.println(method.getReturnType() == void.class); >> > 

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

 public static void main (String[] args) < for (Method method : HelloWorld.class.getDeclaredMethods()) < System.out.println(method.getReturnType() == Void.TYPE); >> 

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

Источник

Оцените статью