При упоминании какого-либо типа возвращаемого значения в сигнатуре методы, кроме void
, в конце выполнения метода метод должен возвращать значение .
Ваш код не подчиняется этому правилу.
Давайте посмотрим, что происходит в вашем коде.
if (user != null) {
// (1) inside if block
} else
return new ModelAndView("oops", "user", user);
Если user
равно нулю, то условие будет false
поэтому контроль исполнения будет передан другому блоку, который будет возвращать экземпляр ModelAndView("oops", "user", user);
так что никаких проблем.
Если user
не равно нулю, то условие будет true
поэтому контроль исполнения будет принят в inside of (1) if block
В внутренней части (1), если блок программы будет писать журнал, а затем контроль выполнения будет перешел на 2nd if
состояние.
Теперь давайте посмотрим, второе условие,
if (user.getUsername().equals("jon")){
return new ModelAndView("echo", "user", user);
}
Вот если имя пользователя равно «джон», то условие будет истинным. Затем будет выполнено управление выполнением inside of (2) if block
. Здесь управление программой выполнит new ModelAndView("echo", "user", user);
и вернет экземпляр. Без вопросов.
Здесь находится точка обмана, если имя пользователя не равно «jon», а затем, когда ничего не представлено, управление выполнением выходит из блока (1) if и достигает конца метода.
Поскольку нет операторов, которые возвращают экземпляр ModelAndView или null, компилятор выполнит ошибку.
Итак, предлагаю вам иметь дело с тем, что нужно вернуть, если имя пользователя не равно «jon», как показано ниже. И не добавляйте return null; в конце, поскольку это может привести к некоторым исключениям времени выполнения ;
public ModelAndView postLoginPage(@ModelAttribute("user") User user, ModelMap model,
HttpServletRequest req, HttpServletResponse res) {
if (user != null) {
logger.log(Level.INFO, "\n\n [*][*][*][*][*] user not null ");
if (user.getUsername().equals("jon")){
return new ModelAndView("echo", "user", user);
} else{ // to avoid compilation error
return new ModelAndView("user is not jon", "user", user);
}
} else
return new ModelAndView("oops", "user", user);
}
Что бы этот метод возвращал, если getUsername() не равен «jon»? – Eran
Я исправил «очевидную» ошибку компиляции из-за отсутствия ')'. Я не думаю, что вопрос был об этом. – Bathsheba
Ошибка вполне объяснима. Есть возможность ничего не вернуть. PS: этот код может вернуть NPE – AxelH