2017-01-30 1 views
0

場合、私はこのコードの些細な部分を持っています。これは実行可能なリターンステートメントではないことについて、Javaが不平を言っているようですか?なぜこれはエラーですか?ブロックのJava

+2

getUsername()が "jon"と等しくない場合、そのメソッドは何を返しますか? – Eran

+0

')'がないために "明白な"コンパイルエラーを修正しました。私は*その質問がそれに関するものだとは思わない*。 – Bathsheba

+0

エラーはかなり明白です。何も返さない可能性があります。 PS:このコードはNPE – AxelH

答えて

2

各メソッドは、すべての可能な入力に対して宣言された型を返すようにする必要があります。

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

見て、condition1trueで、condition2falseあるとき、実行一切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

しかし、コールサイトではnullポインタ例外の可能性について言及してください。 – Bathsheba

6

すべての制御パスに明示的なreturnはありません。 Javaではこれが許されません。

あなたはuseruser.getUsername().equals("jon")trueないnullでない場合に対処する必要があります。

"jon"についての特別なことは何ですか?

+0

を条件のテスト名として返すことができます。だから、もしあれば、もしも他人がいるなら? – Catresl

+2

必ずしも必要ではありません。しかし、 'void' *以外のものとしてマークされた関数は常に値を返す必要があります。 – Bathsheba

+1

@Bathshebaあなたはこの回答のためにポピュラーなバッジが必要です:) – xenteros

0

あなたは離れて voidからメソッドシグネチャ内の任意の戻り値の型に言及すると、メソッドの実行の最後に方法は 値を返す必要があります。

あなたのコードはそのルールに従っていません。

あなたのコードで何が起こっているか見てみましょう。

if (user != null) { 

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

userがnullの場合、条件はとても実行制御がModelAndView("oops", "user", user);ので無問題のインスタンスを返します。これは、他のブロックに渡されますfalseになります。

userがnullでない場合、ブロックプログラムがログを書き込むと、実行制御がされるならば、条件はtrueように実行制御(1)の内部でinside of (1) if block

に渡されるであろう2nd ifに渡されます。

今、ユーザ名は「JON」に等しい場合、条件が真となります。ここ

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

、のは、第二の条件を見てみましょう。その後、実行制御はinside of (2) if blockになります。ここでプログラム制御はnew ModelAndView("echo", "user", user);を実行し、インスタンスを返します。問題ありません。

ユーザー名が "jon"と等しくない場合にトリッキーポイントが表示され、他に何も表示されないと(1)ブロックから実行制御が抜けてメソッドの最後に到達します。

ModelAndViewのインスタンスまたはnullを返すステートメントがないため、コンパイラはエラーによって終了します。

したがって、以下のようにユーザー名が「jon」に等しくない場合、返されるものを処理することをお勧めします。そして、戻り値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);  
} 
関連する問題