2017-01-30 2 views
0

ich dieses triviale Stück Code haben:von einer Rückkehr, wenn Block 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);  
} 

eine Rückkehr mit, wenn in einem Doppel verschachtelt. Es scheint, dass sich Java darüber beklagt, dass dies keine brauchbare Rückkehraussage ist? Warum ist das ein Fehler?

+2

Was würde diese Methode zurückgeben, wenn getUsername() nicht gleich "jon" ist? – Eran

+0

Ich habe den "offensichtlichen" Kompilierfehler aufgrund eines fehlenden ')' behoben. Ich denke nicht * die Frage war darüber. – Bathsheba

+0

Der Fehler ist ziemlich explizit. Es besteht die Möglichkeit, nichts zurückzugeben. PS: Dieser Code könnte eine NPE – AxelH

Antwort

2

Jede Methode muss garantiert den angegebenen Typ für alle möglichen Eingaben zurückgeben.

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

Blick, wenn condition1true und condition2 ist false, wird es ausgeführt keine return Anweisung sein. Dies ist nicht erlaubt.

Die mögliche Lösung ist:

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; 
} 

Offensichtlich zwingen Sie zu überprüfen, ob der Rückgabewert keine null durch Zufall ist, wie ich das von Ihnen Business-Logik Perspektive verstehen ist es nicht wirklich möglich. Trotzdem würde ein guter Programmierer nur für den Fall eine Ausnahme prüfen und auslösen.

+0

Aber erwähnen Sie die Möglichkeit einer Nullzeiger Ausnahme an der Call-Site. – Bathsheba

6

Es gibt keinen expliziten return auf allen Steuerpfaden. Java erlaubt das nicht.

Sie müssen sich mit dem Fall befassen, wo user nicht nullunduser.getUsername().equals("jon") nicht true ist.

Was ist das Besondere an "jon"?

+0

sein ein Testname für die Bedingung zurückgeben. Also sollte jeder etwas anderes haben? – Catresl

+2

Nicht unbedingt nicht. Aber eine Funktion, die als etwas anderes als "void" * markiert ist, muss * immer einen Wert zurückgeben. – Bathsheba

+1

@Bathsheba Sie verdienen populistische Abzeichen für diese Antwort :) – xenteros

0

Wenn Sie eine Rückgabetyp in der Methodensignatur erwähnen abgesehen von void, am Ende des Verfahrens die Ausführung sollte das Verfahren einen Wert zurück.

Ihr Code entspricht dieser Regel nicht.

Lassen Sie uns sehen, was in Ihrem Code passiert.

if (user != null) { 

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

Wenn user null ist, dann wird Zustand false sein, so dass die Ausführung der Steuerung zu anderen Block übergeben werden, die die Instanz von ModelAndView("oops", "user", user); so ohne Probleme zurück.

Wenn user nicht null ist, dann wird die Bedingung true sein, so dass die Ausführungssteuerung wird in die inside of (1) if block

In der Innenseite (1) Wenn der Block das Programm übergeben werden, wird das Protokoll schreiben und dann die Ausführungssteuerung wird übergeben an 2nd if Zustand.

Nun wollen wir die zweite Bedingung sehen,

if (user.getUsername().equals("jon")){ 
    return new ModelAndView("echo", "user", user); 
} 

hier, wenn Benutzernamen „jon“ gleich, dann wird die Bedingung wahr sein. Dann kommt die Ausführungskontrolle inside of (2) if block. Hier führt die Programmsteuerung new ModelAndView("echo", "user", user); aus und gibt die Instanz zurück. Keine Probleme.

Hier kommt der Tricking-Punkt, wenn der Benutzername nicht gleich "jon" ist, dann, da kein anderes vorhanden ist, kommt die Ausführungskontrolle aus dem (1) if-Block und erreicht das Ende der Methode.

Da es keine Anweisungen gibt, die entweder die Instanz von ModelAndView oder null zurückliefern, wird der Compiler einen Fehler ausgeben.

Also, ich schlage vor, Sie zu behandeln, was zurückgeben, wenn der Benutzername nicht gleich "jon" wie unten ist. Und fügen Sie nicht zurück null; am Ende, da es einige Laufzeitausnahmen verursachen kann;

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);  
}