잡동사니

[SimpleDateFormat] java.lang.NumberFormatException 처리하기 본문

IT/Java

[SimpleDateFormat] java.lang.NumberFormatException 처리하기

yeTi 2018. 8. 1. 16:02

안녕하세요. yeTi입니다.

오늘은 간헐적으로 java.lang.NumberFormatException이 발생하는 현상에 대해 얘기하고자 합니다.


근래에 서버에서 다음과 같은 오류가 발생했습니다.

- java.lang.NumberFormatException: For input string: ".77E1."

- java.lang.NumberFormatException: multiple points


우연히 발생하는 위치가 SimpleDateFormat 객체로 parse하는 부분이었습니다.

그래서 SimpleDateFormat 객체와 관련하여 버그를 찾던 중 Thread Safe 관련한 내용들을 찾았습니다.


1. Stack Overflow나 다른 개발자분들의 블로그에서 비슷한 상황에 대한 문제를 찾았습니다.

- 주요 내용은 Multi Thread 환경에서 SimpleDateFormat을 static으로 공유해서 사용하면 parse할때 간헐적으로 문제가 발생한다는 내용입니다.


2. DateFormat에 대한 Javadoc 문서를 확인해봤습니다.

- 다음과 같은 내용이 있습니다.

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

- Multi Thread 환경에서는 synchronize를 관리하라는 내용이 있습니다.


3. 제시한 해결 방법들을 찾아봤습니다.

- static하게 전역으로 사용하지 말고 내부 변수로 선언하고 사용하라는 제안이 있습니다.

- synchronized를 활용하라는 제안이 있습니다.

- 다른 라이브러리(Joda, FastDateFormat, DateTimeFormatter)를 활용하라는 제안이 있습니다.



저는 DateTimeFormatter로 교체하여 테스트 중입니다.



참고 문헌

- Stack Overflow : https://stackoverflow.com/questions/4021151/java-dateformat-is-not-threadsafe-what-does-this-leads-to

- nklee님의 블로그 : http://lng1982.tistory.com/229

- Javadoc : https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html

- David Ford의 Medium: https://medium.com/@daveford/numberformatexception-multiple-points-when-parsing-date-650baa6829b6

- fahd의 블로그 : http://fahdshariff.blogspot.com/2010/08/dateformat-with-multiple-threads.html

- FreeLife님의 블로그 : http://javafactory.tistory.com/300

Comments