Caused by java lang classcastexception android

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

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

Автор: Cristian Stancalau
Дата записи

1. Обзор

В этом коротком уроке мы сосредоточимся на ClassCastException , общем исключении Java .

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

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

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

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

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

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

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

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

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

Проверенное значение Mammal несовместимо со ссылкой Frog , поскольку Frog не является подтипом Mammal . В этом случае компилятор не может нам помочь, так как переменная Animal может содержать ссылку совместимого типа.

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

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

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

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

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

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

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

Мы также получаем исключение ClassCastException , потому что продвижение типа не работает для целых массивов.

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

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

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

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

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

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

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

Последняя строка вызовет исключение ClassCastException , поскольку она не может преобразовать ссылку D ouble в Long .

4. Общие типы

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

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

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

На первый взгляд, мы можем разумно ожидать нулевую ссылку, возвращаемую из блока catch. Однако во время выполнения из-за стирания типа параметр приводится к Object вместо String . Таким образом , компилятор сталкивается с задачей присвоения целого числа | строке , которая вызывает исключение ClassCastException.

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

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

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

Код, используемый в этой статье, можно найти на GitHub .

Источник

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.

Читайте также:  Alfred camera premium android

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.

(Inherited from Throwable) Message

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.

(Inherited from Throwable) GetStackTrace()

Provides programmatic access to the stack trace information printed by #printStackTrace() .

(Inherited from Throwable) GetSuppressed()

Returns an array containing all of the exceptions that were suppressed, typically by the try -with-resources statement, in order to deliver this exception.

(Inherited from Throwable) InitCause(Throwable)

Initializes the cause of this throwable to the specified value.

(Inherited from Throwable) PrintStackTrace()

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

(Inherited from Throwable) PrintStackTrace(PrintStream)

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

(Inherited from Throwable) PrintStackTrace(PrintWriter)

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

(Inherited from Throwable) SetHandle(IntPtr, JniHandleOwnership)

Sets the Handle property.

(Inherited from Throwable) SetStackTrace(StackTraceElement[])

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», но я не мог получить хорошее представление об этом. Есть ли хорошая статья или то, что было бы кратким объяснением?

11 ответов

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Nissan pathfinder r51 2007 android

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

At Another t5 = (Another) new Goat() вы получаете ClassCastException потому что вы не можете создать экземпляр Another класс с помощью Goat .

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

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

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

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

приведите строку » 1 » к int -> no problem

приведите строку » abc » к int -> вызывает ClassCastException

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

Источник

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

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

11 ответов

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

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

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

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

Читайте также:  Android система не установлена

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

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

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

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

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

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

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

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

At Another t5 = (Another) new Goat() вы получаете ClassCastException потому что вы не можете создать экземпляр Another класс с помощью Goat .

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

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

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

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

приведите строку » 1 » к int -> no problem

приведите строку » abc » к int -> вызывает ClassCastException

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

Источник

Оцените статью