Java의 "ClassCastException"설명
"ClassCastException"에 대한 기사를 읽었지만 그것에 대한 좋은 아이디어를 얻지 못했습니다. 좋은 기사가 있거나 간단한 설명이 무엇입니까?
에 대한 API 사양에서 바로 가져옵니다 ClassCastException
.
코드가 인스턴스가 아닌 하위 클래스로 객체를 캐스팅하려고 시도했음을 나타 내기 위해 발생합니다.
따라서, 예를 들어, 하나 개의 시도는 캐스팅 할 때 Integer
A를 String
, String
의 서브 클래스가 아닌 Integer
, 그래서이 ClassCastException
발생합니다.
Object i = Integer.valueOf(42);
String s = (String)i; // ClassCastException thrown here.
정말 간단합니다. 클래스 A의 객체를 클래스 B의 객체로 타입 캐스트하려고하는데 호환되지 않으면 클래스 캐스트 예외가 발생합니다.
클래스 모음을 생각해 봅시다.
class A {...}
class B extends A {...}
class C extends A {...}
- 모든 Java 클래스는 Object에서 상속되기 때문에 이러한 모든 것을 Object로 캐스팅 할 수 있습니다.
- 둘 다 "종류"A이기 때문에 B 또는 C를 A로 캐스팅 할 수 있습니다.
- 실제 개체가 B 인 경우에만 A 개체에 대한 참조를 B로 캐스팅 할 수 있습니다 .
- 둘 다 A 인 경우에도 B를 C로 캐스팅 할 수 없습니다.
클래스를 다운 캐스트하려고 시도 할 때 발생하는 예외이지만 실제로 클래스가 해당 유형이 아닙니다.
다음 계층을 고려하십시오.
개체-> 동물-> 개
다음과 같은 메서드가있을 수 있습니다.
public void manipulate(Object o) {
Dog d = (Dog) o;
}
이 코드로 호출하면 :
Animal a = new Animal();
manipulate(a);
잘 컴파일되지만 런타임에 ClassCastException
o가 실제로 개가 아니라 동물이기 때문에 a를 얻을 수 있습니다.
이후 버전의 Java에서는 다음을 수행하지 않으면 컴파일러 경고가 표시됩니다.
Dog d;
if(o instanceof Dog) {
d = (Dog) o;
} else {
//what you need to do if not
}
예를 들어,
class Animal {
public void eat(String str) {
System.out.println("Eating for grass");
}
}
class Goat extends Animal {
public void eat(String str) {
System.out.println("blank");
}
}
class Another extends Goat{
public void eat(String str) {
System.out.println("another");
}
}
public class InheritanceSample {
public static void main(String[] args) {
Animal a = new Animal();
Another t5 = (Another) new Goat();
}
}
에서 Another t5 = (Another) new Goat()
:을 사용 ClassCastException
하여 Another
클래스 의 인스턴스를 만들 수 없기 때문에을 얻습니다 Goat
.
참고 : 변환은 클래스가 상위 클래스를 확장하고 하위 클래스가 상위 클래스로 캐스트되는 경우에만 유효합니다.
처리 방법 ClassCastException
:
- 클래스의 객체를 다른 클래스로 캐스팅하려고 할 때주의하십시오. 새 유형이 상위 클래스 중 하나에 속하는지 확인하십시오.
- Generics는 컴파일 시간 검사를 제공하고 형식이 안전한 응용 프로그램을 개발하는 데 사용할 수 있으므로 Generics를 사용하여 ClassCastException을 방지 할 수 있습니다.
객체를 그렇지 않은 클래스의 인스턴스로 취급하려고합니다. 이것은 기타의 댐퍼 페달을 밟는 것과 거의 비슷합니다 (피아노에는 댐퍼 페달이 있고 기타에는 없습니다).
캐스팅의 개념을 이해하십니까? 캐스팅은 정적으로 형식화 된 언어이기 때문에 Java에서 매우 일반적으로 사용되는 형식 변환 프로세스입니다. 몇 가지 예 :
문자열 "1"을 int로 캐스트-> 문제 없음
문자열 "abc"를 int로 캐스트-> ClassCastException 발생
또는 Animal.class, Dog.class 및 Cat.class가있는 클래스 다이어그램을 생각해보십시오.
Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.
한 데이터 유형의 Object를 다른 데이터 유형으로 캐스트하려고하면 Java에서 클래스 캐스트 예외가 발생합니다.
Java를 사용하면 호환 가능한 데이터 유형간에 캐스팅이 발생하는 한 한 유형의 변수를 다른 유형으로 캐스팅 할 수 있습니다.
예를 들어, String을 Object로 캐스트 할 수 있으며 유사하게 String 값을 포함하는 Object를 String으로 캐스트 할 수 있습니다.
예
다수의 ArrayList 객체를 보유하는 HashMap이 있다고 가정 해 보겠습니다.
다음과 같은 코드를 작성하면 :
String obj = (String) hmp.get(key);
it would throw a class cast exception, because the value returned by the get method of the hash map would be an Array list, but we are trying to cast it to a String. This would cause the exception.
A very good example that I can give you for classcastException in Java is while using "Collection"
List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));
for(Object obj:list) {
String str = (String)obj;
}
This above code will give you ClassCastException on runtime. Because you are trying to cast Integer to String, that will throw the exception.
You can better understand ClassCastException and casting once you realize that the JVM cannot guess the unknown. If B is an instance of A it has more class members and methods on the heap than A. The JVM cannot guess how to cast A to B since the mapping target is larger, and the JVM will not know how to fill the additional members.
But if A was an instance of B, it would be possible, because A is a reference to a complete instance of B, so the mapping will be one-to-one.
A Java ClassCastException is an Exception that can occur when you try to improperly convert a class from one type to another.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ClassCastExceptionExample {
public ClassCastExceptionExample() {
List list = new ArrayList();
list.add("one");
list.add("two");
Iterator it = list.iterator();
while (it.hasNext()) {
// intentionally throw a ClassCastException by trying to cast a String to an
// Integer (technically this is casting an Object to an Integer, where the Object
// is really a reference to a String:
Integer i = (Integer)it.next();
}
}
public static void main(String[] args) {
new ClassCastExceptionExample();
}
}
If you try to run this Java program you’ll see that it will throw the following ClassCastException:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main (ClassCastExceptionExample.java:19)
The reason an exception is thrown here is that when I’m creating my list object, the object I store in the list is the String “one,” but then later when I try to get this object out I intentionally make a mistake by trying to cast it to an Integer. Because a String cannot be directly cast to an Integer — an Integer is not a type of String — a ClassCastException is thrown.
If you want to sort objects but if class didn't implement Comparable or Comparator, then you will get ClassCastException For example
class Animal{
int age;
String type;
public Animal(int age, String type){
this.age = age;
this.type = type;
}
}
public class MainCls{
public static void main(String[] args){
Animal[] arr = {new Animal(2, "Her"), new Animal(3,"Car")};
Arrays.sort(arr);
}
}
Above main method will throw below runtime class cast exception
Exception in thread "main" java.lang.ClassCastException: com.default.Animal cannot be cast to java.lang.Comparable
참고URL : https://stackoverflow.com/questions/907360/explanation-of-classcastexception-in-java
'Programing' 카테고리의 다른 글
d3.js와 chart.js의 비교 (차트 만 해당) (0) | 2020.10.28 |
---|---|
MongoDB의 $ unwind 연산자는 무엇입니까? (0) | 2020.10.28 |
FBSDKCoreKit / FBSDKCoreKit.h 찾을 수 없음 오류 (0) | 2020.10.28 |
16 진수 문자열 (char [])을 int로 변환 하시겠습니까? (0) | 2020.10.28 |
Visual Studio 디버거에서 개체를 직렬화하는 방법 (0) | 2020.10.28 |