我有这段琐碎的代码:
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抱怨这不是一个可行的退货声明?为什么这是一个错误?
答案 0 :(得分:6)
所有控制路径上都没有明确的return
。 Java不允许这样做。
您需要处理user
不是null
且 user.getUsername().equals("jon")
不是true
的情况。
"jon"
有什么特别之处?
答案 1 :(得分: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
,因为据我所知,从业务逻辑的角度来看,这是不可能的。仍然是一个优秀的程序员会检查并抛出异常以防万一。
答案 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);
}