Error
[Error] java.lang.ClassCastException 해결법
Wonol
2022. 10. 4. 13:35
반응형
출근 하고 Slack 을 확인하니 배치에서 오류가 마구마구 올라오고 있었다.
확인해보니 OpenAPI 를 통해서 응답값을 받아 형변환(Casting) 하는 도중에 에러가 발생하였는데, OpenAPI 응답값 중 기존 Double 형으로 주던 데이터를 Integer 형으로 주면서 에러가 발생하였다.
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Double (java.lang.Integer and java.lang.Double are in module java.base of loader 'bootstrap')
1. 원인
- 간단하게 발생한 비슷한 코드는 아래와 같습니다.
/**
[{id=1, name=황재원, zipcode=54321, num1=2000.0, num2=2000},
{id=2, name=테스트, zipcode=12345, num1=3000.0, num2=3000}]
*/
List<Map<String,Object>> list = result.getBody(); // <- api 응답값을 저장
// 에러 발생(java.lang.ClassCastException)
double price = (double) list.get(0).get("num2");
- API 응답값을 List<Map<String,Object>> 형식으로 저장하고, 그 값 중 num2(Integer) 를 Double 형으로 형변환을 진행하는 도중 에러가 발생하였습니다.
My Think...(틀릴 수 있습니다...)
현재 생각하기로는 Map 에 저장할때, Object 타입으로 저장하면서 원시타입 형태(Primitive type)으로 저장되면서 숫자 데이터(Double, Integer, Float 등)의 명확한 타입을 알 수 없기 때문에 (double) 형태의 형변환을 할 수 없다고 생각합니다.
2. 해결법
- Map 에 담긴 Object 를 변경하고자 할 때 먼저 String 으로 형변환 후 다시 Double 형으로 변환하여 사용합니다.
// 1. String.valueOf() 를 통해 String으로 변환
// 2. String 으로 변환된 값을 Double 형으로 변환하여 사용
double price = Double.parseDouble(String.valueOf(list.get(0).get("num2")));
String.valueOf() 는 String 으로 변경하려는 대상의 타입이 무엇이든 상관없이 String 으로 변경이 가능합니다.
참고
반응형