Объяснение “ClassCastException” в Java

Проверьте индекс

$(this).index() == 0 // is first
71
задан Peter Mortensen 16 November 2016 в 22:46
поделиться

5 ответов

Straight from the API Specifications for the ClassCastException:

Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an Например.

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

Object i = Integer.valueOf(42);
String s = (String)i;            // ClassCastException thrown here.
110
ответ дан 24 November 2019 в 12:50
поделиться

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

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

Объект -> Животное - > Dog

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

 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
 }
20
ответ дан 24 November 2019 в 12:50
поделиться

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

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

81
ответ дан 24 November 2019 в 12:50
поделиться

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

4
ответ дан 24 November 2019 в 12:50
поделиться

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

Преобразование String «1» в int -> нет проблем

Преобразование String «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.
5
ответ дан 24 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: