Domanda

Ho letto alcuni articoli scritti su "ClassCastException", ma non sono riuscito a farmi un'idea chiara.C'è un buon articolo o quale sarebbe una breve spiegazione?

È stato utile?

Soluzione

Direttamente dalle specifiche API per il ClassCastException :

  

Gettato per indicare che il codice ha   tentato di lanciare un oggetto a un   sottoclasse che non è un   esempio.

Quindi, per esempio, quando si cerca di lanciare un Integer ad un String, String non è una sottoclasse di Integer, quindi un ClassCastException sarà gettato.

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

Altri suggerimenti

E 'davvero molto semplice: se si sta cercando di typecast un oggetto della classe A in un oggetto della classe B, e non sono compatibili, si ottiene un'eccezione calco

.

Pensiamo di una collezione di classi.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Si può lanciare qualsiasi di queste cose di opporsi, perché tutte le classi Java ereditano da Object.
  2. Si può lanciare o B o C ad A, perché sono entrambi i tipi di "" A
  3. Si può lanciare un riferimento a un oggetto A a B solo se l'oggetto reale è un B.
  4. Non si può lanciare un B ad un C anche se sono di entrambi A.

Si tratta di un'eccezione che si verifica se si tenta di downcast una classe, ma in realtà la classe non è di quel tipo.

Si consideri questo gerarchia:

  

Oggetto -> animali -> Cane

Si potrebbe avere un metodo chiamato:

 public void manipulate(Object o) {
     Dog d = (Dog) o;
 }

Se viene chiamato con questo codice:

 Animal a = new Animal();
 manipulate(a);

Si compilerà bene, ma in fase di esecuzione si otterrà una ClassCastException perché o era in realtà un animale, non un cane.

Nelle versioni successive di Java si vuole ricevere un avviso del compilatore a meno che non si fa:

 Dog d;
 if(o instanceof Dog) {
     d = (Dog) o;
 } else {
     //what you need to do if not
 }

Considera un esempio,

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();
    }
}

A Another t5 = (Another) new Goat():otterrai un ClassCastException perché non puoi creare un'istanza di Another classe utilizzando Goat.

Nota:La conversione è valida solo nei casi in cui una classe estende una classe genitore e la classe figlia viene convertita nella sua classe genitore.

Come affrontare il ClassCastException:

  1. Fai attenzione quando provi a lanciare un oggetto di una classe in un'altra classe.Assicurati che il nuovo tipo appartenga a una delle sue classi genitore.
  2. È possibile impedire la ClassCastException utilizzando Generics, poiché i Generics forniscono controlli in fase di compilazione e possono essere utilizzati per sviluppare applicazioni indipendenti dai tipi.

Fonte della nota e del resto

Si sta cercando di trattare un oggetto come un'istanza di una classe che non lo è. È approssimativamente analogo a prova di premere il pedale damper di una chitarra (pianoforti hanno pedali ammortizzatori, chitarre no).

Avete capito il concetto di fusione? Casting è il processo di conversione di tipo, che è in Java molto comune perché è un linguaggio a tipizzazione statica. Alcuni esempi:

Fusioni la stringa "1" per un int -> nessun problema

Fusioni la stringa "abc" per un int -> solleva una ClassCastException

O pensare a un diagramma delle classi con Animal.class, Dog.class e 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.

Un'eccezione calco viene lanciata da Java quando si tenta di lanciare un oggetto di un tipo di dati a un altro.

Java ci consente di gettare le variabili di un tipo ad un altro fino a quando la fusione avviene tra tipi di dati compatibili.

Per esempio si può lanciare una stringa come un oggetto e allo stesso modo un oggetto che contiene i valori stringa può essere gettato in una stringa.

Esempio

Supponiamo abbiamo un HashMap che contiene una serie di oggetti ArrayList.

Se scriviamo codice come questo:

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

sarebbe un'eccezione di classe cast, perché il valore restituito dal metodo get della mappa di hash sarebbe una lista di array, ma stiamo cercando di gettare in una stringa. Ciò causerebbe l'eccezione.

Un ottimo esempio che posso darvi per ClassCastException in Java è, mentre l'utilizzo di "Collection"

List list = new ArrayList();
list.add("Java");
list.add(new Integer(5));

for(Object obj:list) {
    String str = (String)obj;
}

Questo codice di cui sopra vi darà ClassCastException sul runtime. Perché si sta cercando di lanciare intero a stringa, che sarà generare l'eccezione.

È possibile capire meglio ClassCastException e la colata, una volta ci si rende conto che la JVM non può indovinare l'ignoto. Se B è un 'istanza di A ha più membri della classe e metodi sul mucchio di A. La JVM non può indovinare come lanciare A a B in quanto l'obiettivo di mapping è più grande, e la JVM non saprà come riempire i membri aggiuntivi.

Ma se A fosse un caso di B, sarebbe possibile, perché A è un riferimento a un'istanza completa di B, quindi la mappatura sarà uno-a-uno.

Un Java ClassCastException è un'eccezione che può verificarsi quando si tenta di convertire in modo improprio una classe da un tipo all'altro.

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();
 }
}

Se si tenta di eseguire il programma Java vedrai che getterà la seguente ClassCastException:

Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample  (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main  (ClassCastExceptionExample.java:19)

Il motivo viene generata un'eccezione in questo caso è che quando sto creando la mia lista oggetto, l'oggetto mi Store nell'elenco è la stringa “uno”, ma poi quando cerco di ottenere questo oggetto fuori ho intenzionalmente fare un errore cercando di lanciare in un numero intero. Perché una stringa non può essere colato direttamente a un numero intero - Un numero intero non è un tipo di stringa -. Un ClassCastException è gettato

Se si desidera ordinare gli oggetti, ma se la classe non ha attuato paragonabili o comparatore, allora si otterrà ClassCastException Ad esempio

class Animal{
   int age;
   String type;

   public Animal(int age, String type){
      this.age = age;
      this.type = type;
   }
}
public class MainCls{
   public static void main(String[] args){
       Animal[] arr = {new Animal(2, "Her"), new Animal(3,"Car")};
       Arrays.sort(arr);
   }
}

Sopra principale metodo getterà sotto runtime eccezione calco

  

Exception in thread "main" java.lang.ClassCastException: com.default.Animal non può essere lanciato a java.lang.Comparable

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top