Почему происходит ошибка "missing return statement" в конструкции try-catch?

Рейтинг: -3Ответов: 1Опубликовано: 10.02.2023

У меня есть метод:

public static String readString(){
    try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))){
        return bufferedReader.readLine();
    } catch (IOException e){
            
    }
}

Выдает ошибку:

Missing return statement

Ответы

▲ 1Принят

Ошибка missing return statement возникает, когда метод, который имеет тип возвращаемого значения (является не void), ничего не возвращает оператором return.

Давайте посмотрим на ваш метод с точки зрения jdk.

Так, нужно постараться выполнить код в блоке try. Есть два варианта: код в блоке try выполнится или не выполнится (произойдёт исключение).

Если код в блоке try выполнится (исключения не произойдёт): из метода будет возвращена строка, считанная BufferedReader'ом. Всё ок.

Если код в блоке try не выполнится (произойдёт исклоючение): программа "перепрыгивает" в блок catch. В блоке catch ничего не возвращается. Программа будет выполнять метод дальше, но в методе больше ничего нет. И оператора return, который должен вернуть значение, тоже нет. А метод должен возвращать строку. Всё плохо, так быть не должно. Вот и причина ошибки.

Решение проблемы:

Нужно добавить оператор return в блок catch. Можно вернуть сообщение об ошибке, например:

} catch (IOException e){
    return "Ошибка! Не удалось считать данные!";
}

Но можно сделать даже так:

} catch (IOException e){
    return e.getMessage();
}

P.S:

В данном случае не нужно использовать try-with-resources, про это уже говорил @NowhereMan. Просто используйте обычный try-catch. И закрывать поток System.in не надо:

try {
   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
   return bufferedReader.readLine();
} catch (IOException e){
   return "Ошибка! Проблема при чтении данных!";
}