Pergunta

Eu li alguns artigos escritos sobre "ClassCastException", mas eu não podia ter uma boa idéia sobre isso. Existe um bom artigo ou o que seria uma breve explicação?

Foi útil?

Solução

Direto das especificações API para o ClassCastException :

Lançada para indicar que o código tem tentativa de moldar um objecto para uma subclasse de que não é uma exemplo.

Assim, por exemplo, quando se tenta lançar um Integer a um String, String não é uma subclasse de Integer, portanto, um ClassCastException será lançada.

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

Outras dicas

É realmente muito simples:. Se você está tentando typecast um objeto da classe A em um objeto da classe B, e eles não são compatíveis, você recebe uma exceção de lançamento de classe

Vamos pensar em uma coleção de classes.

class A {...}
class B extends A {...}
class C extends A {...}
  1. Você pode lançar qualquer uma dessas coisas de se opor, porque todas as classes Java herdam de Object.
  2. Você pode lançar B ou C para A, porque eles são ambos os "tipos de" A
  3. Você pode lançar uma referência a um objeto A para B somente se o objeto real é um B.
  4. Você não pode lançar um B para um C, embora ambos são da A.

É uma exceção que ocorre se você tentar downcast uma classe, mas na verdade a classe não é desse tipo.

Considere esta hierarquia:

Objeto -> Animal -> Dog

Você pode ter um método chamado:

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

Se chamado com este código:

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

Ele irá compilar muito bem, mas em tempo de execução você receberá um ClassCastException porque o era na verdade um animal, não um cão.

Em versões posteriores do Java você receber um aviso do compilador menos que você faça:

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

Considere um exemplo,

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

No Another t5 = (Another) new Goat(): você receberá um ClassCastException porque você não pode criar uma instância da classe Another usando Goat.

Nota :. A conversão é válida somente nos casos em que uma classe herda uma classe pai ea classe criança está escalado para sua classe pai

Como lidar com a ClassCastException:

  1. Tenha cuidado ao tentar converter um objeto de uma classe para outra classe. Certifique-se de que o novo tipo pertence a uma de suas classes pai.
  2. Você pode impedir que o ClassCastException usando Generics, porque Genéricos fornecer cheques tempo de compilação e pode ser usado para desenvolver aplicações de tipo seguro.

Fonte da nota e do Resto

Você está tentando tratar um objeto como uma instância de uma classe que não é. É mais ou menos análogo ao tentar pressionar o pedal de sustentação em uma guitarra (pianos têm amortecedor pedais, guitarras não).

Você entende o conceito de vazamento? Fundição é o processo de conversão de tipo, que é em Java muito comum, porque é uma linguagem de tipagem estática. Alguns exemplos:

Lançai a String "1" para um int -> não há problema

Lançai a "abc" String para um int -> levanta uma ClassCastException

Ou pense em um diagrama de classes com 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.

Uma exceção classe elenco é lançada pelo Java quando você tenta converter um objeto de um tipo de dados para outro.

Java nos permite variáveis ??do elenco de um tipo para outro, desde que o elenco acontece entre tipos de dados compatíveis.

Por exemplo, você pode lançar uma String como um objeto e da mesma forma um objeto que contém valores String pode ser convertido para uma String.

Exemplo

Vamos supor que temos um HashMap que detém uma série de ArrayList objetos.

Se escrever um código como este:

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

que iria lançar uma exceção de lançamento de classe, porque o valor retornado pelo método get do mapa de hash seria uma lista de matriz, mas estamos tentando lançá-lo em um String. Isso faria com que a exceção.

Um bom exemplo que posso dar-lhe para ClassCastException em Java é ao usar "Coleção"

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

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

Este código acima lhe dará ClassCastException em tempo de execução. Porque você está tentando lançar Integer para String, que irá lançar a exceção.

Você pode entender melhor ClassCastException e fundição uma vez que você perceber que a JVM não pode adivinhar o desconhecido. Se B é uma instância de A que tem mais membros de classe e métodos na pilha de A. A JVM não pode adivinhar como lançar A para B desde o alvo de mapeamento é maior, eo JVM não vai saber como preencher os membros adicionais.

Mas, se um era uma instância de B, seria possível, porque A é uma referência a uma instância completa do B, então o mapeamento será um-para-um.

A Java ClassCastException é uma exceção que pode ocorrer quando você tenta converter indevidamente uma classe de um tipo para outro.

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 você tentar executar este programa Java você verá que ele irá lançar o seguinte ClassCastException:

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

A razão apresentada uma exceção aqui é que quando eu estou criando minha lista de objeto, a loja que eu objeto na lista é a String “um”, mas depois quando eu tentar obter este objeto que eu intencionalmente fazer uma erro ao tentar lançá-lo para um inteiro. Porque uma String não pode ser diretamente convertida em um Integer - Um inteiro não é um tipo de corda -. Uma ClassCastException é lançada

Se você quiser objetos de classificação, mas se a classe não implementar comparáveis ??ou Comparador, então você vai ter ClassCastException Por exemplo

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

Acima principal método vai jogar abaixo exceção tempo de execução classe elenco

Exception in thread "main" java.lang.ClassCastException: com.default.Animal não pode ser convertido para java.lang.Comparable

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top