2017-01-30 3 views
0

У меня есть этот тривиальный кусок кода:Возвращаясь из блока, если Java

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 
    return new ModelAndView("oops", "user", user);  
} 

С возвращением вложенной в два раза, если. Кажется, java жалуется, что это не является жизнеспособным заявлением о возврате? Почему это ошибка?

+2

Что бы этот метод возвращал, если getUsername() не равен «jon»? – Eran

+0

Я исправил «очевидную» ошибку компиляции из-за отсутствия ')'. Я не думаю, что вопрос был об этом. – Bathsheba

+0

Ошибка вполне объяснима. Есть возможность ничего не вернуть. PS: этот код может вернуть NPE – AxelH

ответ

2

Каждый метод должен гарантировать возврат объявленного типа для всех возможных входных данных.

if (condition1) { 
    if (condition2) { 
     return a; 
    } 
} else { 
    return b; 
} 

взгляд, когда condition1 является true и condition2 является false, не будет никакого return заявление казнены. Это запрещено.

Возможное решение:

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 { 
     return new ModelAndView("oops", "user", user);  
    } 
    return null; 
} 

Очевидно, что это заставляет вас, чтобы проверить, если возвращаемое значение не null случайно, как я понимаю, что от вас бизнес-логики точки зрения это не представляется возможным. Тем не менее хороший программист проверял и выдавал исключение на всякий случай.

+0

Но упоминайте о возможности исключения нулевого указателя на сайте вызова. – Bathsheba

6

На всех путях управления нет явного return. Java этого не позволяет.

Вы должны иметь дело со случаем, когда user не nullиuser.getUsername().equals("jon") не true.

Что такого особенного в отношении "jon"?

+0

его тестовое имя для условия. Так что каждый, если должен иметь еще? – Catresl

+2

Не обязательно нет. Но функция, отмеченная как нечто, отличная от 'void' *, обязательно должна всегда возвращать значение. – Bathsheba

+1

@ Батшеба вы заслуживаете популистский значок для этого ответа :) – xenteros

0

При упоминании какого-либо типа возвращаемого значения в сигнатуре методы, кроме 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);  
} 
Смежные вопросы