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 .