場合、私はこのコードの些細な部分を持っています。これは実行可能なリターンステートメントではないことについて、Javaが不平を言っているようですか?なぜこれはエラーですか?ブロックのJava
答えて
各メソッドは、すべての可能な入力に対して宣言された型を返すようにする必要があります。
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
ないかどうかを確認するためにあなたを強制します。それでも良いプログラマがチェックし、例外をスローします。
しかし、コールサイトではnullポインタ例外の可能性について言及してください。 – Bathsheba
すべての制御パスに明示的なreturn
はありません。 Javaではこれが許されません。
あなたはuser
がとuser.getUsername().equals("jon")
がtrue
ないnull
でない場合に対処する必要があります。
"jon"
についての特別なことは何ですか?
あなたは離れて
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);
}
getUsername()が "jon"と等しくない場合、そのメソッドは何を返しますか? – Eran
')'がないために "明白な"コンパイルエラーを修正しました。私は*その質問がそれに関するものだとは思わない*。 – Bathsheba
エラーはかなり明白です。何も返さない可能性があります。 PS:このコードはNPE – AxelH