[Java] java.lang.ClassCastException
예외 상황1
원인
심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
클래스 형 변환(캐스팅) 연산을 잘못 했을 때 발생한 예외
HashMap에 있는 숫자값으로 이루어진 Object(Wrapper)를 정수형 DTO에 언박싱 하려다가 뜬 예외문이다.
Object 객체를 int로 바로 넣을려고 했다가 나온 예외다.
해결 시도
Integer.parseInt(Object)
parseInt() 사용하면 당연하게 될 줄 알았지만..
심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
해결
((Long) userService.getAttendanceList(currentUser)).intValue();
해결 코드 문법
HashMap<String, Object> result = new HashMap<>();
Dto_graph dto = new Dto_graph();
result = menuservice.serviceCount();
dto.setnServiceCount( ((Long) result.get("cnt1")).intValue() );
dto.setnFreeVMCount( ((Long) result.get("cnt2")).intValue()) ;
dto.setnVMCount( ((Long) result.get("cnt3")).intValue() );
예외 상황 정리
1.캐스팅 관련 예외 (잘못된 형변환)
예외 상황2
원인
참조한 라이브러리 안의 클래스가 중복되어 정확한 경로를 찾지 못하여 발생하는 것이다.
Java로 만든 프로그램 배포를 위해 톰캣(WAS)로 패키징을 하는 경우가 많다.
이 때 이클립스에서 잘 작동하던 프로그램이 패키징을 하고 나면 다음과 같은 에러가 발생할 때가 있다.
java.lang.ClassCastException : A cannot be cast to B
해결
톰캣은 최상위 lib 디렉터리에 톰캣 관련 라이브러리를 넣고 WEB-INF 밑의 lib 디렉터리에 자바 라이브러리를 넣는다.
에러의 원인은 참조한 라이브러리 안의 클래스가 중복되어 정확한 경로를 찾지 못하여 발생하는 것이다.
따라서 두개의 lib 디렉터리 중 한군데에만 적용을 시켜주면 해결이 된다.
예외 상황2 정리
1.참조하는 라이브러리 경로 문제.
2.멀쩡하던게 다른데로 옮겼다고 예외가 뜨면 경로 문제가 대부분이다.
'java' 카테고리의 다른 글
[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2019.10.30 |
---|---|
[Java] parseInt()와 intValue() (0) | 2019.10.29 |
[Java] 상속 (0) | 2019.10.27 |
[Java] 추상 클래스 (0) | 2019.10.26 |
[Java] 예약어 정리 (2) | 2019.10.23 |