2010-08-18 2 views
18

Как правило, в чем причина получения java.lang.ClassCastException ..? Я получаю следующее сообщение об ошибке в моем приложенииjava.lang.ClassCastException

java.lang.ClassCastException: [Lcom.rsa.authagent.authapi.realmstat.AUTHw 
+0

Похоже, у вас нет полного сообщения об исключении. Предполагая, что вы используете Java 5 или более поздней версии, исключение должно включать в себя сведения о * what *, которые нельзя отличить от * what *, например. 'java.lang.ClassCastException: java.lang.String не может быть добавлено в java.lang.Integer' – mikej

ответ

36

По the documentation:

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

Object x = new Integer(0); 
System.out.println((String)x); 
+5

+1 для документа. Документация об исключениях обычно дает хороший намек на то, что может быть неправильным. –

+0

+1 для документации! Если вы не хотите постоянно использовать Google, вы можете загрузить источник java-библиотеки (или выполнить поиск, если у вас уже есть src.zip где-то в папке java sdk). Затем, если вы связали его с вашим проектом, вы можете просто открыть соответствующий файл и прочитать javadocs там ... –

+0

bine Laur, ce mic e internetul :) – ieugen

2

Это потому, что вы кастинг на неправильные вещи - вы пытаетесь преобразовать к определенному типу, а объект, который относится ваш экспресс к несовместим с этим типом , Например:

Object x = "this is a string"; 
InputStream y = (InputStream) x; // This will throw ClassCastException 

Если бы вы могли предоставить образец кода, который действительно поможет ...

0
ClassA a = <something>; 
ClassB b = (ClassB) a; 

2-я линия потерпит неудачу, если ClassA не подкласс ClassB и бросит ClassCastException.

6

@ Ответ Laurenţiu Dascălu объясняет, как/почему вы получаете исключение ClassCastException.

Ваше сообщение об исключении выглядит довольно подозрительным для меня, но это может помочь вам узнать, что «[Lcom.rsa.authagent.authapi.realmstat.AUTHw» означает, что фактический тип объекта, который вы пытались выполнить, был com.rsa.authagent.authapi.realmstat.AUTHw[]; то есть это был объект массива.

Обычно, следующие шаги для решения проблемы, как это являются:

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

A ClassCastException ocurrs при попытке применить экземпляр объекта к типу, которого нет. Кастинг работает только тогда, когда заброшенный объект следует за отношением «есть» к типу, который вы пытаетесь выполнить. Пример

Apple myApple = new Apple(); 
Fruit myFruit = (Fruit)myApple; 

Это работает, потому что яблоко является «плодом». Однако, если мы отменим это.

Fruit myFruit = new Fruit(); 
Apple myApple = (Apple)myFruit; 

Это вызовет исключение ClasCastException, поскольку Fruit не является (всегда) Apple.

Это хорошая практика для защиты каких-либо явных приведений с instanceof проверки первого:

if (myApple instanceof Fruit) { 
    Fruit myFruit = (Fruit)myApple; 
} 
+0

Если последний пример изменится на 'if (myFruit instanceof Apple) {Apple myApple = (Apple) myFruit; } ', это будет более наглядным – AnnabellChan

1

Чтобы избежать x !instance of Long Prob Добавить

<property name="openjpa.Compatibility" value="StrictIdentityValues=false"/> 

в вашей настойчивости.xml

Смежные вопросы