Объяснение «ClassCastException» в Java

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

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

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

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

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

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

Давайте подумаем о наборе classов.

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

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

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

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

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

  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 } 

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

 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 classа с помощью Goat .

Примечание . Преобразование действует только в тех случаях, когда class расширяет родительский class, а дочерний class передается его родительскому classу.

Как работать с ClassCastException :

  1. Будьте внимательны при попытке передать объект classа в другой class. Убедитесь, что новый тип принадлежит одному из его родительских classов.
  2. Вы можете предотвратить исключение ClassCastException с помощью Generics, поскольку Generics предоставляют проверки времени компиляции и могут использоваться для разработки приложений с поддержкой типов.

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

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

Вставить строку «1» в int -> no problem

Вставить строку «abc» в int -> вызывает ClassCastException

Или подумайте о диаграмме classов с 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. 

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

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

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

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

пример

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

Если мы напишем такой код:

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

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

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

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

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

Java ClassCastException – это исключение, которое может возникать при попытке неправильно преобразовать class из одного типа в другой.

 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.

  • Java: ExecutorService, который блокируется при представлении после определенного размера очереди
  • Как создать заставку с прозрачным фоном в JavaFX
  • Java Подождите, пока stream завершится
  • Java System-Wide Keyboard Shortcut
  • Как предотвратить зависание Eclipse при запуске?
  • Общие элементы в двух списках
  • Являются ли while (true) «петлями так плохо?
  • Java noob: генерики только над объектами?
  • Запрос HTTP-клиента Java с заданным таймаутом
  • Java AWT / SWT / Swing: как планировать графический интерфейс?
  • Как печатать цвет в консоли с помощью System.out.println?
  • Давайте будем гением компьютера.