JAVA,Eclipse,MySQLを使用してコードを書いています。
出勤時間、休憩時間、休憩終了時間、退勤時間がある場合は労働時間の計算がうまくいきエラーが出ません。
問題は休憩開始時間がNULLの時と休憩終了時間がNULLの時に例外が発生していて例外が解消されず息詰まっている状態です。コードが長く読みにくいとはございますがご教授いただけたら助かります。
Eclipse
1例外 2java.lang.NullPointerException: text 3 java.base/java.util.Objects.requireNonNull(Objects.java:233) 4 java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1950) 5 java.base/java.time.LocalTime.parse(LocalTime.java:464) 6 java.base/java.time.LocalTime.parse(LocalTime.java:449) 7 servlet.AbsenceServlet.doPost(AbsenceServlet.java:154) 8 javax.servlet.http.HttpServlet.service(HttpServlet.java:652) 9 javax.servlet.http.HttpServlet.service(HttpServlet.java:733) 10 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
dto
1public class WorkDto { 2 3 4 private String userid;//ユーザーID 5 private String workday;//日付 6 private String attendacetimes;//出勤時間 7 private String startbreaktimes;//休憩開始時間 8 private String endbreaktimes;//休憩終了時間 9 private String absencetimes;//退勤時間 10 private String sumworktimes;//合計労働時間 11 12 public String getUserid() { 13 return userid; 14 } 15 public void setUserid(String userid) { 16 this.userid = userid; 17 } 18 ...省略 19}
dao
1public class WorkDao { 2 private DBConnection db; 3 public WorkDao(DBConnection db) { 4 this.db = db; 5 } 6 //JDBCの接続に使用するオブジェクトを宣言 7 Connection con = null ; // Connection(DB接続情報)格納用変数 8 PreparedStatement ps = null ; // PreparedStatement(SQL発行用オブジェクト)格納用変数 9 ResultSet rs = null ; // ResultSet(SQL抽出結果)格納用変数 10 11//全件取得処理 12 13 public WorkDto SelectAllWorktimetable(String userid,String workday)throws Exception { 14 WorkDto workdto = new WorkDto(); 15 try { 16 String sql = "SELECT * FROM worktimetable WHERE userid = ? AND workday = ?"; 17 con = db.getConnection(); 18 ps = con.prepareStatement(sql); 19 ps.setString(1, userid); 20 ps.setString(2, workday); 21 rs = ps.executeQuery(); 22 if (rs.next()) { 23 workdto.setUserid(rs.getString("userid")); 24 workdto.setWorkday(rs.getString("workday")); 25 workdto.setAttendacetimes(rs.getString("attendacetimes")); 26 workdto.setStartbreaktimes(rs.getString("startbreaktimes")); 27 workdto.setEndbreaktimes(rs.getString("endbreaktimes")); 28 workdto.setAbsencetimes(rs.getString("absencetimes")); 29 workdto.setSumworktimes(rs.getString("sumworktimes")); 30 } 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 } finally { 34 //------------------------------------------- 35 //接続の解除 36 //------------------------------------------- 37 ...省略} 38 return workdto; 39 } 40
servlet
1protected void doPost(..... { 2 //セッションからユーザーデータを取得 3 HttpSession session = request.getSession(); 4 UserDto userLoginSession = (UserDto)session.getAttribute("userlogin");//ログインセッション 5 String userid = (String)session.getAttribute("userid"); 6 WorkDto workdto = new WorkDto(); 7 WorkLogic worklogic = new WorkLogic(); 8 9 LocalDate localDate = LocalDate.now();//日付 10 LocalTime localTime = LocalTime.now();//現在時刻 11 12 DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("HH:mm"); 13 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 14 String workday = localDate.format(dateFormat);//今日の日付 15 String attendacetimes;//出勤時間 16 String absencetimes = localTime.format(timeFormat);//退勤時間 17 String startbreaktimes;//休憩開始時間 18 String endbreaktimes;//休憩終了時間 19 String sumworktimes;//合計勤務時間 20 21 LocalTime localAttendacetimes;//ローカル出勤時間 22 LocalTime localStartbreaktimes;//ローカル休憩時間 23 LocalTime localEndbreaktimes;//ローカル休憩終了時間 24 LocalTime localAbsencetimes;//ローカル退勤時間 25 LocalTime localBreaktime;//ローカル合計休憩時間 26 LocalTime localWorktime;//ローカル勤務時間 27 LocalTime localSumworktimes;//ローカル合計勤務時間 28 29 Duration worktimeduration; 30 Duration breaktimetimesduration; 31 Duration sumworktimesduration; 32 33 boolean judge = false; //true:成功/false:失敗) 34 35 //ログイン状態によって表示画面を振り分ける 36 if (userLoginSession != null) { 37 //absencetimesセッションがある場合(true:成功/false:失敗) 38 try { 39 workdto = worklogic.SelectAllWorktimetableCheck(userid,workday);//全件取得 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 workdto.getUserid();//ユーザーID 44 workdto.getWorkday();//日付 45 workdto.getAttendacetimes();//出勤時間 46 workdto.getStartbreaktimes();//休憩開始時間 47 workdto.getEndbreaktimes();//休憩終了時間 48 workdto.getAbsencetimes();//退勤時間 49 50 //ユーザーID&日付がある場合 51 if(workdto.getUserid() != null & workdto.getWorkday() != null) { 52 //退勤時間がない場合に退勤時間を登録 53 if(workdto.getAbsencetimes() == null) { 54 workdto.setUserid(userid);//ユーザーID 55 workdto.setWorkday(workday);//日付 56 workdto.setAbsencetimes(absencetimes);//退勤時間 57 //DBに登録 58 try { 59 judge = worklogic.registAbsencetimeCheck(workdto); 60 } catch (Exception e) { 61 // TODO 自動生成された catch ブロック 62 e.printStackTrace(); 63 } 64 }else { 65 judge = false; 66 } 67 }else { 68 judge = false; 69 } 70 71 if (judge) { 72 try { 73 workdto = worklogic.SelectAllWorktimetableCheck(userid,workday);//全件取得 74 } catch (Exception e) { 75 // TODO 自動生成された catch ブロック 76 e.printStackTrace(); 77 } 78 userid = workdto.getUserid();//ユーザーID 79 workday = workdto.getWorkday();//日付 80 attendacetimes = workdto.getAttendacetimes();//出勤時間 81 startbreaktimes = workdto.getStartbreaktimes();//休憩開始時間 82 endbreaktimes = workdto.getEndbreaktimes();//休憩終了時間 83 absencetimes = workdto.getAbsencetimes();//退勤時間 84 85 if(userid != null & workday != null) { 86 if(absencetimes != null) {//退勤時間がある場合 87 localAttendacetimes = LocalTime.parse(attendacetimes); 88 localStartbreaktimes = LocalTime.parse(startbreaktimes); 89 localEndbreaktimes = LocalTime.parse(endbreaktimes); 90 localAbsencetimes = LocalTime.parse(absencetimes); 91 92/////////////////////////////////////////////////////////////////////////////////////// 93 //問題のエラーが出る処理箇所 94/////////////////////////////////////////////////////////////////////////////////////// 95 96 if(startbreaktimes == null){//休憩開始時間がnullの場合 97 //休憩時間がNULLの場合 98 //勤務時間 99 worktimeduration = Duration.between(localAttendacetimes,localAbsencetimes); 100 localSumworktimes = LocalTime.MIDNIGHT.plus(worktimeduration); 101 //労働時間文字列に変換 102 sumworktimes = localSumworktimes.format(timeFormat); 103 //DB登録 104 try { 105 judge = worklogic.registSumworktimesCheck(userid,workday,sumworktimes); 106 } catch (Exception e) { 107 // TODO 自動生成された catch ブロック 108 e.printStackTrace(); 109 } 110 }else if(endbreaktimes == null) {//休憩終了時間がnullの場合 111 //勤務時間 112 worktimeduration = Duration.between(localAttendacetimes,localAbsencetimes); 113 localWorktime = LocalTime.MIDNIGHT.plus(worktimeduration); 114 localBreaktime = LocalTime.of(1,0);//ローカルタイムに変換 115 //労働時間の計算 116 sumworktimesduration = Duration.between(localBreaktime,localWorktime); 117 localSumworktimes = LocalTime.MIDNIGHT.plus(sumworktimesduration); 118 //労働時間文字列に変換 119 sumworktimes = localSumworktimes.format(timeFormat); 120// DB登録 121 try { 122 judge = worklogic.registSumworktimesCheck(userid,workday,sumworktimes); 123 } catch (Exception e) { 124 // TODO 自動生成された catch ブロック 125 e.printStackTrace(); 126 } 127 }else if(attendacetimes != null & startbreaktimes != null & endbreaktimes != null & absencetimes !=null) { 128 //勤務時間 129 worktimeduration = Duration.between(localAttendacetimes,localAbsencetimes); 130 localWorktime = LocalTime.MIDNIGHT.plus(worktimeduration); 131 //休憩時間の計算 132 breaktimetimesduration = Duration.between(localStartbreaktimes,localEndbreaktimes); 133 localBreaktime = LocalTime.MIDNIGHT.plus(breaktimetimesduration); 134 //労働時間の計算 135 sumworktimesduration = Duration.between(localBreaktime,localWorktime); 136 localSumworktimes = LocalTime.MIDNIGHT.plus(sumworktimesduration); 137 //労働時間文字列に変換 138 sumworktimes = localSumworktimes.format(timeFormat); 139// DB登録 140 try { 141 judge = worklogic.registSumworktimesCheck(userid,workday,sumworktimes); 142 } catch (Exception e) { 143 // TODO 自動生成された catch ブロック 144 e.printStackTrace(); 145 } 146 }else { 147 judge = false; 148 } 149/////////////////////////////////////////////////////////////////////////////////////// 150 //処理終 151/////////////////////////////////////////////////////////////////////////////////////// 152 153}else { 154 judge = false; 155 } 156 }else { 157 judge = false; 158 } 159 }else { 160 judge = false; 161 } 162 163 //成功/失敗に応じて表示させる画面を振り分ける 164 if (judge) { 165 //成功 166 request.getRequestDispatcher("/WEB-INF/jsp/absencetimes_success.jsp").forward(request, response); 167 } else { 168 //失敗した場合、エラー画面(error.jsp)を表示する 169 request.setAttribute("absencetimesError", "既に退勤ボタンが押されています"); 170 request.getRequestDispatcher("/WEB-INF/jsp/user_main.jsp").forward(request, response); 171 } 172 }else { 173 //失敗:ログインNGとしてログイン画面へ転送 174 request.getRequestDispatcher("/WEB-INF/jsp/user_login.jsp").forward(request, response); 175 } 176} 177}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/04 06:20