java lang classcastexception что это

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

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

11 ответов

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

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

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

давайте подумаем о коллекции классов.

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

рассмотрим эту наследственность:

у вас может быть метод под названием:

если вызывается с этим кодом:

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

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

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

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

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

или подумайте о диаграмме классов с Animal.класс, пес.класс и кошка.класс!—2—>

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

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

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

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

пример

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

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

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

очень хороший пример, который я могу дать вам для classcastException в Java, при использовании «Collection»

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

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

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

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

Если вы попытаетесь запустить эту программу Java, вы увидите, что она бросит следующее исключение ClassCastException:

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

Читайте также:  что делать если вышел чирик подмышкой

Если вы хотите сортировать объекты, но если класс не реализовал Comparable или Comparator, то вы получите ClassCastException Например

выше main метод будет бросать ниже класса выполнения cast exception

исключение в потоке» main » java.ленг.ClassCastException: com.по умолчанию.Животное не может быть брошено на java.ленг.Сравнимый

Источник

Class Cast Exception Class

Definition

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance.

Remarks

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

Constructors

Constructs a ClassCastException with no detail message.

A constructor used when creating managed representations of JNI objects; called by the runtime.

Constructs a ClassCastException with no detail message.

Fields

Properties

Returns the cause of this throwable or null if the cause is nonexistent or unknown.

(Inherited from Throwable) Class (Inherited from Throwable) Handle

The handle to the underlying Android instance.

(Inherited from Throwable) JniIdentityHashCode (Inherited from Throwable) JniPeerMembers LocalizedMessage

Creates a localized description of this throwable.

Returns the detail message string of this throwable.

(Inherited from Throwable) PeerReference (Inherited from Throwable) StackTrace (Inherited from Throwable) ThresholdClass

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

Methods

Appends the specified exception to the exceptions that were suppressed in order to deliver this exception.

(Inherited from Throwable) Dispose() (Inherited from Throwable) Dispose(Boolean) (Inherited from Throwable) FillInStackTrace()

Fills in the execution stack trace.

Initializes the cause of this throwable to the specified value.

Prints this throwable and its backtrace to the standard error stream.

Prints this throwable and its backtrace to the standard error stream.

Prints this throwable and its backtrace to the standard error stream.

Sets the Handle property.

Sets the stack trace elements that will be returned by #getStackTrace() and printed by #printStackTrace() and related methods.

(Inherited from Throwable) ToString() (Inherited from Throwable) UnregisterFromRuntime() (Inherited from Throwable)

Explicit Interface Implementations

IJavaPeerable.Disposed() (Inherited from Throwable)
IJavaPeerable.DisposeUnlessReferenced() (Inherited from Throwable)
IJavaPeerable.Finalized() (Inherited from Throwable)
IJavaPeerable.JniManagedPeerState (Inherited from Throwable)
IJavaPeerable.SetJniIdentityHashCode(Int32) (Inherited from Throwable)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) (Inherited from Throwable)
IJavaPeerable.SetPeerReference(JniObjectReference) (Inherited from Throwable)

Extension Methods

Performs an Android runtime-checked type conversion.

Источник

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

Давайте подробнее рассмотрим исключение ClassCastException.

1. Обзор

Давайте рассмотрим некоторые сценарии, которые приводят к возникновению этого исключения, и как мы можем их избежать.

2. Явный Кастинг

Для наших следующих экспериментов рассмотрим следующие классы:

2.1. Классы литья

Безусловно, наиболее распространенный сценарий встречи с ClassCastException явно приводит к несовместимому типу.

Читайте также:  laude pl smart intermodal что это такое

Например, давайте попробуем бросить Лягушку в Млекопитающее :

Мы могли бы ожидать здесь ClassCastException , но на самом деле мы получаем ошибку компиляции: “несовместимые типы: Лягушка не может быть преобразована в млекопитающее”. Однако ситуация меняется, когда мы используем общий супертип:

Теперь мы получаем ClassCastException из второй строки:

Интересно отметить, что ошибка компиляции возникает только тогда, когда мы пытаемся привести к однозначно несовместимому классу. То же самое не относится к интерфейсам, поскольку Java поддерживает наследование нескольких интерфейсов, но только одно наследование для классов. Таким образом, компилятор не может определить, реализует ли ссылочный тип определенный интерфейс или нет. Давайте приведем пример:

Мы получаем ClassCastException во второй строке вместо ошибки компиляции:

2.2. Литейные массивы

Мы видели, как классы обрабатывают приведение, теперь давайте посмотрим на массивы. Приведение массива работает так же, как и приведение класса. Однако мы можем запутаться в автобоксах и продвижении типов или их отсутствии.

Таким образом, давайте посмотрим, что происходит с примитивными массивами, когда мы пытаемся выполнить следующее приведение:

Вторая строка вызывает исключение ClassCastException as autoboxing не работает для массивов.

Как насчет продвижения по службе? Давайте попробуем следующее:

2.3. Безопасное литье

В случае явного приведения настоятельно рекомендуется проверить совместимость типов перед попыткой приведения с помощью instanceof .

Давайте рассмотрим пример безопасного приведения:

3. Загрязнение Кучи

В соответствии со спецификацией Java : ” Загрязнение кучи может произойти только в том случае, если программа выполнила какую-либо операцию с использованием необработанного типа, которая приведет к появлению непроверенного предупреждения во время компиляции”.

Для нашего эксперимента рассмотрим следующий универсальный класс:

Теперь мы попытаемся загрязнить кучу следующим образом:

4. Общие типы

Давайте рассмотрим следующий общий метод:

А теперь давайте назовем это:

5. Заключение

В этой статье мы рассмотрели ряд распространенных сценариев неподходящего кастинга.

Источник

Explanation of ClassCastException in Java

I read some articles written on «ClassCastException», but I couldn’t get a good idea on what it means. What is a ClassCastException?

12 Answers 12

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 instance.

It’s really pretty simple: if you are trying to typecast an object of class A into an object of class B, and they aren’t compatible, you get a class cast exception.

Let’s think of a collection of classes.

It is an Exception which occurs if you attempt to downcast a class, but in fact the class is not of that type.

Consider this heirarchy:

You might have a method called:

If called with this code:

It will compile just fine, but at runtime you will get a ClassCastException because o was in fact an Animal, not a Dog.

In later versions of Java you do get a compiler warning unless you do:

Consider an example,

Note: The conversion is valid only in cases where a class extends a parent class and the child class is casted to its parent class.

How to deal with the ClassCastException :

Источник

Что еще может бросить ClassCastException в java?

Это вопрос интервью.

Я не могу спросить интервьюера, так как я не получил работу.

сценарий:

последующий код:

C1 c1FromCache = (C1) cache.get(«a»);

этот код создает исключение ClassCastException.

Читайте также:  приз в адской кухне какой

что может причины быть?

Я сказал, потому что кто-то другой поставить другой объект с тем же ключом и поэтому переписал его. Мне сказали нет, подумайте о других возможностях.

Я сказал, что, возможно, jar, определяющий класс C1, не был доступен на этом узле (не уверен, приведет ли это к классу cast или ClassNotFoundException, но я хватался за любой свинец сейчас. Тогда я сказал, Может быть, неправильный вариант класса? Сказали же баночку класса С1 есть во всех узлы.)

Изменить/ Добавить спросил, бросает ли get ClassCast, но ему сказали нет. после этого я сказал ему, что мое действие для решения такой проблемы будет заключаться в том, чтобы бросить тест jsp, который будет имитировать действия и поместить лучшее ведение журнала (трассировку стека) после исключения. это была 2-я часть вопроса (почему и что бы вы сделали, если бы это произошло в производстве)

у кого-нибудь есть любые идеи о том, почему кэш get приведет к броску проблема?

4 ответов

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

ответ на редактирование:

что бы вы сделали, если бы это произошло в производстве?

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

рассмотрим следующий пример иерархии.

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

как уже упоминалось, общим сценарием, где это происходит, является развертывание веб-приложений, где вообще говоря AppClassloader близко напоминает путь к классам настроенные в appserver, а затем Classloader1 и Classloader2 представляют пути к классам индивидуально развернутых веб-приложений.

если несколько веб-приложений развертывают одни и те же банки/классы, то ClassCastException может произойти, если есть какой-либо механизм для веб-приложений для совместного использования объектов, таких как кэш или общий сеанс.

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

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

другой способ избежать этого-работать только на интерфейсах, которые являются общими объектами. Затем интерфейсы должны быть загружены выше в иерархии загрузчиков классов, а сами классы не делают. Ваш пример получения объекта из кэша будет таким же, но C1 класс будет заменен интерфейс, что C1 реализует.

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

независимо от классов выше запустите следующую программу. Он не должен делиться classpath с вышеуказанными классами, чтобы убедитесь, что они загружены из файла JAR.

при запуске этого отображается следующий вывод:

Источник

Сказочный портал