Подтвердить что ты не робот

Объяснение "ClassCastException" в Java

Я прочитал несколько статей, написанных на "ClassCastException", но я не мог понять, как это сделать. Есть ли хорошая статья или что будет краткое объяснение?

4b9b3361

Ответ 1

Прямо из спецификации API для ClassCastException:

Брошенный, чтобы указать, что код имеет попытался бросить объект на подкласс которого не является экземпляр.

Так, например, когда кто-то пытается передать Integer в String, String не является подклассом Integer, поэтому будет выбрано ClassCastException.

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

Ответ 2

Это очень просто: если вы пытаетесь приписать объект класса A объекту класса B, и они несовместимы, вы получаете исключение класса.

Подумайте о наборе классов.

class A {...}
class B extends A {...}
class C extends A {...}
  • Вы можете передать любую из этих вещей объекту, потому что все классы Java наследуются от Object.
  • Вы можете использовать B или C для A, потому что они оба являются "видами" A
  • Вы можете ссылаться на объект A на B только в том случае, если реальным объектом является B.
  • Вы не можете наложить B на C, даже если они оба A.

Ответ 3

Это исключение, которое возникает, если вы пытаетесь понизить класс, но на самом деле класс не относится к этому типу.

Рассмотрим эту иерархию:

Объект → Животное → Собака

У вас может быть вызванный метод:

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

Если вызывается с помощью этого кода:

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

Он будет компилироваться просто отлично, но во время выполнения вы получите ClassCastException, потому что o на самом деле был Animal, а не собакой.

В более поздних версиях Java вы получите предупреждение о компиляторе, если вы не выполните:

 Dog d;
 if(o instanceof Dog) {
     d = (Dog) o;
 } else {
     //what you need to do if not
 }

Ответ 4

Рассмотрим пример,

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. Вы можете предотвратить исключение ClassCastException с помощью Generics, поскольку Generics предоставляют проверки времени компиляции и могут использоваться для разработки приложений с поддержкой типов.

Источник примечания и остальные

Ответ 5

Вы понимаете концепцию кастинга? Кастинг - это процесс преобразования типов, который в Java очень распространен, потому что это статически типизированный язык. Некоторые примеры:

Вставить строку "1" в int → no problem

Вставить строку "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.

Ответ 6

Вы пытаетесь рассматривать объект как экземпляр класса, которого нет. Это примерно аналогично попытке нажимать педаль демпфера на гитаре (у пианино есть демпферные педали, нет гитар).

Ответ 7

Исключение класса cast исключается Java при попытке передать объект одного типа данных другому.

Java позволяет нам передавать переменные одного типа другому, если кастинг происходит между совместимыми типами данных.

Например, вы можете использовать String как объект, и аналогичным образом объект, содержащий значения String, может быть перенесен в строку.

Пример

Предположим, что у нас есть HashMap, который содержит несколько объектов ArrayList.

Если мы пишем код следующим образом:

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

он выкинет исключение класса, потому что значение, возвращаемое методом get хэш-карты, будет списком Array, но мы пытаемся передать его в String. Это приведет к исключению.

Ответ 8

Вы можете лучше понять ClassCastException и кастинг, как только вы поймете, что JVM не может угадать неизвестное. Если B является экземпляром A, он имеет больше членов класса и методов в куче, чем A. JVM не может угадать, как отличать A до B, поскольку цель сопоставления больше, а JVM не знает, как заполнить дополнительные элементы.

Но если A был экземпляром B, это было бы возможно, потому что A является ссылкой на полный экземпляр B, поэтому отображение будет взаимно однозначным.

Ответ 9

Хорошим примером того, что я могу дать вам для classcastException в 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, это вызовет исключение.

Ответ 10

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)

Причина, по которой здесь возникает исключение, заключается в том, что когда я создаю свой объект списка, объект, который я храню в списке, является строкой "один", но потом, когда я пытаюсь получить этот объект, я намеренно совершу ошибку пытаясь отбросить его в Integer. Поскольку String не может быть непосредственно применена к Integer - целое не является типом String - генерируется исключение ClassCastException.

Ответ 11

Следующий псевдокод лучше объяснит это.

if (object to be casted follows an "ISA" relationship with the classtype it is being casted to) {
    There will not be any exception
}
else {
    It will throw class cast exception.
}