728x90
반응형

발생에러


Cause: java.lang.NumberFormatException: For input string: "Y"

 

MyBatis Mapper 파일(xml)에서 위와 같은 에러 발생했다.

문제가 되는 구문은 아래의 조건문인데

 

<if test="emlTrmsAgreYn == 'Y'"> 
	eml_trms_agre_yn = #{emlTrmsAgreYn}
</if>

 

eml_trms_agre_yn 컬럼은 varchar형이라 문자이고 파라미터로 넣어준 emlTrmsAgreYn도 String이다.

String과 문자 Y를 비교하는거라 (문자== 문자) 임에도 불구하고 NumberFormatException이 발생하고 있었다.

 

 

◆ 원인


조건문에서 홑따옴표(') 안에 한 글자만 있을 경우 이걸 String이 아닌 char로 인식을 하고 있었고, 이것을 숫자로 변환하려다 보니

(문자==숫자)의 비교처리가 되어 NumberFormatException이 발생하는게 원인이었다.

 

기본적으로 char는 16진수 4자리의 숫자로 문자를 표기할수 있음으로, 0 ~ 65535까지의 숫자를 대입할수 있다.

같은 값에 대해 16진수, 10진수, 문자형식 모두 지정이 가능하다는것인데,

마이바티스 내부적으로 문자'Y'가 아닌 10진수 89로 읽지 않았나 추측해 본다.

문자 10진수 16진수
Y 89 0x59
N 78 0x4E

 

 

◆ 해결방안


문자가 한글자인 경우, 아래와 같은 방법으로 비교할 수 있다.

1. 홑따('')가 아닌 쌍따옴표("")를 사용
     <if test="emlTrmsAgreYn == 'Y' ">    ⇒    <if test= 'emlTrmsAgreYn == "Y" '

2. 홑따('')를 HTML방식으로 변경해서 사용
     <if test="emlTrmsAgreYn == 'Y' ">    ⇒    <if test= "emlTrmsAgreYn == &quot;Y &quot;  "

3. toString() 함수를 사용하여 문자를 String으로 변환
     <if test="emlTrmsAgreYn == 'Y' ">    ⇒    <if test="emlTrmsAgreYn == 'Y'.toString() ">

4. equals() 함수를 사용하여 명시적으로 문자로 비교
     <if test="emlTrmsAgreYn == 'Y' ">    ⇒    <if test="emlTrmsAgreYn.equals('Y') ">  

 

 


글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --

 

728x90
반응형