質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5017閲覧

日付変換でNullPointerExceptionが発生する

nyan_engineer

総合スコア30

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/21 08:12

編集2019/06/21 08:33

前提・実現したいこと

社員管理システムを学習の一環で作っています。
社員情報の更新を行う際にエラーが発生しております。

発生している問題・エラーメッセージ

社員情報の更新ページでは「退職日」という項目が存在します。
これは必要に応じて入力するものになりますが、入力せずに更新を行うと
以下NullPointerExceptionのエラーが発生します。

error

1java.lang.NullPointerException 2 at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1439) 3 at java.text.DateFormat.parse(DateFormat.java:364) 4 at convert.Convert.formatDateSlash(Convert.java:35) 5 at dao.EmployeeInfoDao.findDetail(EmployeeInfoDao.java:144) 6 at controller.DetailController.doPost(DetailController.java:134) 7 at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 8 at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 9 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 10 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 11 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 12 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 13 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 14 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 15 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 16 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 17 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 18 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 19 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 20 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 21 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 22 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) 23 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 24 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 25 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 26 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 27 at java.lang.Thread.run(Thread.java:748)

該当のソースコード

java

1public String formatDateSlash(String formatDate) { 2 3 Constants strConst = new Constants(); 4 5 try { 6 //フォーマットパターンを'yyyy-MM-dd'に指定します。 7 SimpleDateFormat format1 = new SimpleDateFormat(strConst.AD_DATE_DASH, Locale.ENGLISH); 8 Date date = format1.parse(formatDate); 9 //フォーマットパターンを'yyyy/MM/dd'に変更します。 10 SimpleDateFormat format2 = new SimpleDateFormat(strConst.AD_DATE_SLASH); 11 formatDate = format2.format(date); 12 13 return formatDate; 14 15 } catch (ParseException e) { 16 17 e.printStackTrace(); 18 return null; 19 20 } catch (NullPointerException e) { 21 22 e.printStackTrace(); 23 return null; 24 25 } finally { 26 27 } 28 }

試したこと

try-catchでNullPointerExceptionを例外処理するようにしましたが、
変わらずエラーが発生します。

どうかご教授いただければ幸いです。

###追記
呼び出し元のソースコードです。

EmployeeInfoDao

1public EmployeeInfoDto findDetail(String employee_id) { 2 3 EmployeeInfoDto employeeInfoDto = null; 4 Connection conn = null; 5 PreparedStatement pStmt = null; 6 ResultSet rs = null; 7 int employeeId; 8 9 try { 10 11 employeeId = Integer.parseInt(employee_id); 12 13 Convert cvrt = new Convert(); 14 SqlConstants sqlConst = new SqlConstants(); 15 Constants strConst = new Constants(); 16 17 Class.forName(sqlConst.JDBC_DRIVER); 18 conn = DriverManager.getConnection(sqlConst.DB_CONNECT_URI, sqlConst.USER_NAME, sqlConst.PASSWORD); 19 pStmt = conn.prepareStatement(sqlConst.SEARCH_EMPLOYEE_DETAIL); 20 pStmt.setInt(1, employeeId); 21 rs = pStmt.executeQuery(); 22 23 while (rs.next()) { 24 25 employeeInfoDto = new EmployeeInfoDto(); 26 employeeInfoDto.setEmployeeId(rs.getString(strConst.EMPLOYEE_ID)); 27 employeeInfoDto.setName(rs.getString(strConst.NAME)); 28 employeeInfoDto.setNameHiragana(rs.getString(strConst.NAME_HIRAGANA)); 29 employeeInfoDto.setBirthday(cvrt.formatDateSlash(rs.getString(strConst.BIRTHDAY))); 30 employeeInfoDto.setSex(rs.getString(strConst.SEX)); 31 employeeInfoDto.setMailAddress(rs.getString(strConst.MAIL_ADDRESS)); 32 employeeInfoDto.setTelephoneNumber(cvrt.addDash(rs.getString(strConst.TELEPHONE_NUMBER))); 33 employeeInfoDto.setCompanyInfoId(rs.getString(strConst.COMPANY_INFO_ID)); 34 employeeInfoDto.setBusinessManager(rs.getString(strConst.BUSINESS_MANAGER)); 35 employeeInfoDto.setDepartment(rs.getString(strConst.DEPARTMENT)); 36 employeeInfoDto.setCommissioningStatus(rs.getString(strConst.COMMISSIONING_STATUS)); 37 employeeInfoDto.setEnterDate(cvrt.formatDateSlash(rs.getString(strConst.ENTER_DATE))); 38 employeeInfoDto.setRetireDate(cvrt.formatDateSlash(rs.getString(strConst.RETIRE_DATE))); 39 employeeInfoDto.setStatus(rs.getString(strConst.STATUS)); 40 41 return employeeInfoDto; 42 } 43 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 47 return null; 48 49 } catch (ClassNotFoundException e) { 50 e.printStackTrace(); 51 52 return null; 53 54 } catch (NumberFormatException e) { 55 e.printStackTrace(); 56 57 return null; 58 59 } finally { 60 61 if (conn != null) { 62 63 try { 64 65 conn.close(); 66 67 } catch (SQLException e) { 68 e.printStackTrace(); 69 70 return null; 71 72 } 73 } 74 } 75 return employeeInfoDto; 76 } 77

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/06/21 08:31 編集

formatDateSlashの呼び出し元はNullを受けても大丈夫な作りですか? もしくは、NullだったらformatDateSlashを利用しないようになっていますか?
nyan_engineer

2019/06/21 08:38

呼び出し元のソースコードを追記しました。 Nullである場合にformatDateSlashを利用しない作りにはまだできておりません。。
guest

回答2

0

ベストアンサー

普通にnullチェックすればいい話なのでは?
というか、例外に頼らず本来はそうすべき。

java

1public String formatDateSlash(String formatDate) { 2 if(formatDate == null) return null; 3 // 以下同じ、ただし、NullPointerの例外処理は不要

投稿2019/06/21 08:45

編集2019/06/21 08:50
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2019/06/21 08:49

代入式になっちゃってます。
swordone

2019/06/21 08:51

おうふ。ご指摘ありがとうございます。
nyan_engineer

2019/06/21 09:02

回答ありがとうございます。 例外処理をする必要は無いんですね。。 どの場面で例外処理を行うのかなど、まだまだ勉強不足でした、、
nyan_engineer

2019/06/21 10:09

参考になります、、!ありがとうございます。
guest

0

e.printStackTrace();でエラーの内容が表示されているだけでは。
処理がそこで止まってしまうのであれば問題ですが・・・

投稿2019/06/21 08:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyan_engineer

2019/06/21 08:26

処理は問題なくおこなわれます。 エラー内容が表示されていても特に問題はないですか? 毎回エラーメッセージが表示されるので、、
tetutetu

2019/06/21 08:33 編集

横からですみません。 e.printStackTrace(); はエラーをコンソールに出力するための記述なので コンソールにエラーが出力されるのは当然です。 不要なのであれば、NullPointerExceptionをキャッチした際の処理を //do nothing(コメントアウト。何もしない の意)等記述しておくとよいと思います 何も記述していない場合、第三者がコードを見た際に(例外処理忘れてるのかな?)とあらぬ誤解を生む原因になります。 追記:同じくfinallyの中身もコメントアウトで何もしない旨を書いた方が適切だとは思われます 理由は上に同じです。
LouiS0616

2019/06/21 08:50 編集

@tetutetu さん 安易に握り潰しを勧めるのはまずいでしょう。相手が例外に不慣れなようならば尚更。 そもそもNullPointerExceptionはキャッチして捌くべき類のものでは無いですし...
nyan_engineer

2019/06/21 08:54

勉強不足で申し訳ありません。。 そもそも、入力値がnullである場合にこのメソッドを使わないようにするべきでしょうか?
退会済みユーザー

退会済みユーザー

2019/06/21 09:11

使うべきかどうかというより、formatDateSlash() にnullが突っ込まれてもいいようにしておくのがいいと思います。
nyan_engineer

2019/06/21 10:00

yukke_さん ありがとうございます。別回答のように、例外処理ではなくnullチェックにて対応いたします。
swordone

2019/06/21 16:03

finallyで何もしないなら、そもそもfinallyブロック自体いらないのだが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問