Перейти к основному содержимому

Отсутствует оператор возврата Java

· 4 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим распространенную ошибку в процессе разработки Java. Обычно с этой проблемой сталкиваются новички, ошибка отсутствия оператора возврата в приложении Java.

Ошибка отсутствующего оператора возврата является ошибкой времени компиляции . Он выбрасывается на этапе компиляции. Современные IDE обнаруживают эту ошибку на лету. Поэтому этот тип ошибки, как правило, легко обнаружить.

Основные причины:

  • оператор return был просто пропущен по ошибке
  • метод не возвращает никакого значения, но в сигнатуре метода не объявлен тип void

2. Отсутствует заявление о возврате

Сначала мы рассмотрим пару примеров. Эти примеры относятся к оператору return, который был пропущен по ошибке. Затем мы будем искать пример отсутствующего типа void в сигнатуре метода. Каждый пример показывает, как мы можем устранить ошибку оператора возврата java.

2.1. Пропущенный оператор возврата

Далее давайте определим простой метод pow :

public int pow(int number) {
int pow = number * number;
}

В результате компиляции предыдущего кода получаем:

java: missing return statement

Чтобы решить эту проблему, мы просто добавим оператор return после переменной pow :

public int pow(int number) {
int pow = number * number;
return pow;
}

Следовательно, если мы вызовем метод pow, мы получим ожидаемый результат.

Аналогично, но с условными конструкциями возникает такая ошибка:

public static String checkNumber(int number) {
if (number == 0) {
return "It's equals to zero";
}
for (int i = 0; i < number; i++) {
if (i > 100) {
return "It's a big number";
}
}
}

Приведенный выше код проверяет введенный номер. Сначала сравните введенное число с 0. Если условие истинно, возвращается строковое значение. Затем, если число больше 0, мы находим цикл for с внутренним условием. Наш условный оператор внутри цикла for выполняется, если « i » больше 100. Но как насчет отрицательного входного числа? Да, ты прав. Мы пропускаем оператор возврата по умолчанию. Поэтому, если мы скомпилируем наш код, мы снова получим ошибку оператора java:missing return .

Итак, чтобы исправить это, нам просто нужно поместить оператор возврата по умолчанию в конце метода:

public static String checkNumber(int number) {
if (number == 0) {
return "It's equals to zero";
}
for (int i = 0; i < number; i++) {
if (i > 100) {
return "It's a big number";
}
}
return "It's a negative number";
}

2.2. Отсутствующий возврат в лямбдах

Кроме того, при работе с лямбда-выражениями эта ошибка могла появиться. Для функций может быть немного сложно обнаружить эту ошибку. Метод map в потоках — обычное место, где возникает эта ошибка. Давайте проверим наш код:

public Map<String, Integer> createDictionary() {
List<String> words = Arrays.asList("Hello", "World");
Map<String, Integer> dictionary = new HashMap<>();
words.stream().map(s -> {dictionary.put(s, 1);});
return dictionary;
}

Предыдущий код выглядит нормально. Есть заявление о возврате. Наш возвращаемый тип данных равен сигнатуре метода. Но как насчет кода внутри метода карты в потоке? Метод карты ожидает функцию в качестве аргумента. В этом случае мы только помещаем данные в наш словарь внутри метода карты. В результате, если мы попытаемся скомпилировать этот код, мы снова получим ошибку оператора java:missing return .

Далее, чтобы устранить ошибку, мы просто заменяем карту на метод forEach в потоке:

words.forEach(s -> {dictionary.put(s, 1);});

Или напрямую вернуть карту из потока:

dictionary = words.stream().collect(Collectors.toMap(s -> s, s -> 1))

2.3. Отсутствует подпись метода

Наконец, последний случай — это когда мы пропустили добавление возвращаемого типа в сигнатуру нашего метода. Следовательно, когда мы пытаемся скомпилировать наш метод, мы получаем ошибку. Следующий пример кода показывает нам это поведение:

public pow(int number) {
int pow = number * number;
return pow;
}

Мы забыли добавить int в качестве возвращаемого типа. Если мы добавим его в наш метод, сигнатура исправит эту ошибку:

public int pow(int number) {
int pow = number * number;
return pow;
}

3. Заключение

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

Как обычно, все фрагменты, использованные в этой статье, доступны на GitHub .