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 으로 변경이 가능합니다.

참고

- https://forwe.tistory.com/25

반응형