티스토리 뷰


java.lang.ClassCastException 에러 해결 방법

초보자의 입장에서 ClassCastException이 발생하는 경우와 에러 해결 방법을 알아보자.

 

Exception을 만났을 때 참고하기 가장 좋은 자료는  Java API 문서와 구글링을 통한 원인과 해결방법 검색이다. 먼저 API를 살펴보자. 

 

구글에 검색할때는 "java api ClassCastException" 정도로 검색하면 된다. https://docs.oracle.com/javase/9/docs/api/java/lang/ClassCastException.html

 

ClassCastException (Java SE 9 & JDK 9 )

 

docs.oracle.com

API 문서를 살펴보게 되면 RuntimeException을 상속받는 클래스로 나온다. RuntimeException을 상속받는 Exception을 보면 코드를 실행하다가 튀어나온다고 생각하면 된다.

public class ClassCastException
extends RuntimeException

/*
Thrown to indicate that the code has attempted 
to cast an object to a subclass of which it is not an instance. 
For example, the following code generates a ClassCastException:
*/

     Object x = new Integer(0);
     System.out.println((String)x);

Integer로 만든 인스턴스를 String으로 캐스팅하고( (String)x ) 있다. 캐스팅은 상속받은 클래스로 업 캐스팅하던가, 상위 클래스에서 자기 본 클래스로 다운 캐스팅을 하는 수밖에 없다.

 

뭔가에 의해 업 캐스팅된 인스턴스를( 여기서는 x ) 잘못된 다운 캐스팅을 하면서 만나는 경우가 대부분일텐데 원래 클래스를 알기 위한 방법 2가지를 알아보자.

 

1) API 스펙을 잘 살펴보자.

어떤 클래스건 API 설명에 리턴되는 형태에 대한 설명이 있을 것이다. 물론 주석과 doc이 제대로 되어있지 않은 경우를 만날수도 있겠지만... 그래도 빠르게 살펴볼수 있는 첫번째 확인사항이다. 

이클립스 IDE에서는 메서드의 자동완성 기능을 찍으면 우측에 api 스펙을 보여준다. 리턴되는 형태나 아래 설명 부분을 잘 살펴보면 왠만하면 알수 있을 것이다. 

 

2) Object.getClass() 함수를 통해 클래스를 살펴보자.

public class test {
	public static void main(String[] args) {
		Object x = new Integer(1);
		System.out.println( x.getClass() );
	}
}

 

결과 : class java.lang.Integer

 

따라서 Integer로 캐스팅을 할 수 있다.

 

해결방법이 아주 쉽다. 상속과 인터페이스의 개념을 잘 안다면 더 쉽고. ㅇㅋ?


댓글
최근에 올라온 글
최근에 달린 댓글