programing

Java에서의 ClassCast Exception 설명

kingscode 2022. 10. 30. 20:42
반응형

Java에서의 ClassCast Exception 설명

ClassCastException이라는 기사를 읽었는데 무슨 뜻인지 잘 모르겠어요.ClassCastException이란 무엇입니까?

의 API 사양에서 직접 참조:

코드가 인스턴스가 아닌 서브클래스에 오브젝트를 캐스팅하려고 시도했음을 나타냅니다.

캐스트를 캐스트하려고 하면 캐스트하려고 합니다.Integer a까지String,String is is is is is isclassclassclassclassclass of의 가 아닙니다.IntegerClassCastException던져질 것이다.

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.

매우 간단합니다. 클래스 A의 오브젝트를 클래스 B의 오브젝트로 타이프 캐스트 하려고 하는데 호환되지 않으면 클래스 캐스트 예외가 발생합니다.

수업 모음을 생각해 봅시다.

class A {...}
class B extends A {...}
class C extends A {...}
  1. 모든 Java 클래스는 개체에서 상속되므로 이러한 항목 중 하나를 개체로 캐스팅할 수 있습니다.
  2. B 또는 C 중 하나를 A에 캐스팅할 수 있습니다. 둘 다 A의 일종이기 때문입니다.
  3. 실제 객체가 B일 경우에만 A 객체에 대한 참조를 B에 캐스팅할 수 있습니다.
  4. 둘 다 A라고 해서 B를 C에 주조할 수는 없어요.

이는 클래스를 다운캐스트하려고 할 때 발생하는 예외이지만 실제로는 해당 클래스가 아닙니다.

이 가계를 생각해 봅시다.

오브젝트 -> 동물 -> 개

다음과 같은 방법을 사용할 수 있습니다.

 public void manipulate(Object o) {
     Dog d = (Dog) o;
 }

다음 코드로 호출된 경우:

 Animal a = new Animal();
 manipulate(a);

에는 「」가 됩니다.ClassCastException왜냐하면 o는 사실 개가 아니라 동물이었기 때문이다.

이후 버전의 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:

  1. 클래스의 오브젝트를 다른 클래스에 캐스팅하려고 할 때는 주의해 주세요.새 유형이 부모 클래스 중 하나에 속하는지 확인하십시오.
  2. Generics를 사용하면 ClassCastException을 방지할 수 있습니다.Generics는 컴파일 시간 체크를 제공하며 타입 세이프 응용 프로그램을 개발하는 데 사용할 수 있기 때문입니다.

메모 및 기타 출처

캐스팅의 개념을 이해하십니까?캐스팅은 타입 변환 프로세스로, 정적 타입 언어이기 때문에 Java에서는 매우 일반적입니다.몇 가지 예:

스트링 캐스트링"1"에 대해서int, 경유Integer.parseInt("1")-> 문제 없습니다.

스트링 캐스트링"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 it's a dog.
Cat c = (Dog) a; // Will cause a compiler error for type mismatch; you can't cast a dog to a cat.

클래스 캐스트 예외는 한 데이터 유형의 개체를 다른 데이터 유형에 캐스트하려고 하면 Java에 의해 느려집니다.

Java를 사용하면 호환되는 데이터 유형 간에 캐스팅이 이루어지는 한 한 유형의 변수를 다른 유형으로 캐스팅할 수 있습니다.

예를 들어 String을 개체로 캐스팅할 수 있으며 마찬가지로 String 값을 포함하는 개체를 String으로 캐스팅할 수 있습니다.

다수의 ArrayList 개체를 저장하는 HashMap이 있다고 가정합니다.

코드를 이렇게 쓰면:

String obj = (String) hmp.get(key);

해시 맵의 get 메서드에서 반환되는 값이 Array 목록이 되기 때문에 클래스 캐스트 예외가 발생하지만 String에 캐스트하려고 합니다.이로 인해 예외가 발생합니다.

개체를 클래스의 인스턴스가 아닌 인스턴스로 처리하려고 합니다.이는 기타로 댐퍼 페달을 밟는 것과 거의 유사합니다(피아노에는 댐퍼 페달이 있지만 기타에는 없습니다).

제가 수업 시간에 드릴 수 있는 아주 좋은 예시는Java에서 예외는 "Collection"을 사용하는 경우입니다.

List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));

for(Object obj:list) {
    String str = (String)obj;
}

위의 코드는 실행 시 ClassCastException을 제공합니다.Integer를 String으로 캐스팅하려고 하면 예외가 느려집니다.

ClassCastException 및 캐스팅은 JVM이 알 수 없는 것을 추측할 수 없다는 것을 알게 되면 더 잘 이해할 수 있습니다.B가 A의 인스턴스인 경우 힙에 A보다 더 많은 클래스 멤버와 메서드가 있습니다.매핑 대상이 더 크기 때문에 JVM은 A를 B로 캐스트하는 방법을 추측할 수 없으며 JVM은 추가 멤버를 채우는 방법을 알지 못합니다.

단, A가 B의 인스턴스라면 A는 B의 완전한 인스턴스를 참조하기 때문에 매핑은 1대 1이 됩니다.

예외가 런타임의 하위 클래스가 아닙니다.예외 -> ClassCastException

    final Object  exception = new Exception();
    final Exception data = (RuntimeException)exception ;
    System.out.println(data);

Java ClassCastException은 클래스를 어떤 유형에서 다른 유형으로 잘못 변환하려고 할 때 발생할 수 있는 예외입니다.

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();
 }
}

이 Java 프로그램을 실행하려고 하면 다음 ClassCastException이 느려지는 것을 볼 수 있습니다.

Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample  (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main  (ClassCastExceptionExample.java:19)

여기서 예외가 발생하는 이유는 목록 개체를 만들 때 목록에 저장하는 개체가 문자열 "1"이지만 나중에 이 개체를 꺼내려고 할 때 의도적으로 개체를 Integer로 캐스팅하려고 하기 때문입니다.String을 Integer에 직접 캐스트할 수 없기 때문에(Inger는 String의 유형이 아닙니다), ClassCastException이 느려집니다.

오브젝트를 정렬하고 싶은데 클래스에서 Comparible 또는 Comparator가 구현되지 않은 경우 ClassCastException이 표시됩니다.예를 들어,

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);
   }
}

위의 기본 메서드는 런타임 클래스 캐스트 예외를 아래로 던집니다.

스레드 "main" java.lang에 예외가 있습니다.ClassCastException : com.default.동물을 java.lang에 캐스팅할 수 없습니다.동등한

언급URL : https://stackoverflow.com/questions/907360/explanation-of-classcastexception-in-java

반응형