从if块返回Java

时间:2017-01-30 11:37:35

标签: java if-statement 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);       
}

返回嵌套在double if中。似乎java抱怨这不是一个可行的退货声明?为什么这是一个错误?

3 个答案:

答案 0 :(得分:6)

所有控制路径上都没有明确的return。 Java不允许这样做。

您需要处理user不是null user.getUsername().equals("jon")不是true的情况。

"jon"有什么特别之处?

答案 1 :(得分:2)

必须保证每个方法都返回所有可能输入的声明类型。

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

查看,当condition1truecondition2false时,将不会执行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,因为据我所知,从业务逻辑的角度来看,这是不可能的。仍然是一个优秀的程序员会检查并抛出异常以防万一。

答案 2 :(得分:0)

  

除了提及方法签名中的任何返回类型之外   void,在方法执行结束时,该方法应该返回一个   值。

您的代码不遵守该规则。

让我们看看您的代码中发生了什么。

if (user != null) {

    // (1) inside if block       
} else 
     return new ModelAndView("oops", "user", user); 

如果user为null,则条件为false,因此执行控制将传递给else块,该块将返回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);
}

如果username等于“jon”,则条件为真。然后执行控制将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);       
}