質問: ``` このコードをこの下のコードをその下のコードに変更したところ、NullPointerExceptionが出ます。 <%if(loginUser!=null) %> <% if(loginUser.getName()!=null & loginUser.getPass()!=null){ %> ``` jspのコードの全体です。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="model.User" %> <% //セッションスコープからユーザー情報を取得 User loginUser=(User)session.getAttribute("loginUser"); %> どこつぶログイン どこ粒ログイン /* このコードをこの下のコードをその下のコードに変更したところ、NullPointerExceptionが出ます。 <%if(loginUser!=null) %> */ <% if(loginUser.getName()!=null & loginUser.getPass()!=null){ %> ログインに成功しました。 ようこそ<%=loginUser.getName() %>さん つぶやき投稿.閲覧へ <%}else{ %> ログインに失敗しましt。 TOPへ <%} %> ```
回答: loginUserのnullチェックが消えたため、loginUserがnullの場合に落ちます。 loginUserのnullチェックも別途行う必要があります。 ``` // loginUserのnullチェックと中身のnullチェックを同時に if(loginUser != null && loginUser.getName()!= null && loginUser.getPass()!= null){ // nullでなければ処理 } ``` または、 ``` // 先にloginUserのnullチェック if(loginUser != null){ // loginUserがnullでなければ、中身のnullチェック if(loginUser.getName()!=null && loginUser.getPass()!=null){ // 中身もnullでなければ処理 } } ``` あと、論理積演算子は"&"と"&&"の2つがあります、 処理が異なるので注意して使用してください。 "&&"を使用した場合は、左辺がfalseであった場合、 全体の結果がfalseになることが確定しているので右辺の評価を行いません。 "&"の演算子だった場合、左辺がfalseであった場合でも、右辺の評価が実行されます。 論理和演算子も同じく"|"と"||"があります。 こちらは"||"の場合、左辺がtrueだったら右辺の処理が行われなくなります。 自分が行いたい処理をよく考え、適切な演算子を使ってください。