Duvidas sobre questão envolvendo Null

11 respostas
Kaesar

Ola a todos, estou com duvida referente ao uso de cast de referências e null, segue a questão:

  1. interface Min{}
    2.
    3. class A{}
    4.
    5. class B extends A implements Min{}
    6.
    7. class C extends B{}
    8.
    9. public class CCExp{
    10. public static void main(String args[]){
    11. A a=new A();
    12. B b=new B();
    13. C c=new C();
    14. Min m=null;
    15. b=©m;
    16. m=(Min)b;
    17. A a2=(A)m;
    18. B b2=(B)a2;
    19. Min m2=©b2;
    20. C c2=©m2;
    21. }
    22. }

A questão pede para que identifique se uma exception é lançada. A resposta correta e que nunca e lançada, entretanto a minha duvida consiste em:

  • Porque os códigos na linha 14 e 15 são legais? Não deveria haver um NullPointerException ou algo do gênero na linha 15?

11 Respostas

luciano2

Se você tentar fazer Cast de null ele aceita, isso é normal.

evertonsilvagomesjav

Nessa linha aqui nao gera excessao n?

17. A a2=(A)m; // um objeto A não é um objeto "Min", e nessa linha um objeto "Min" passaria no teste de instaceof tanto para B quanto para Min, nao?

Z

O NullPointer só aconteceria se voce tentasse usar o objeto de fato. (chamada de metodo ou attributo)

Com instancias de objetos, a VM verifica se o tipo do objeto corresponde a tipo da variavel que está sendo atribuída.
Se houvesse algum exception, nesse caso, seria um ClassCastException.

Porém, no caso do null, essas verificações de tipo são desnecessárias, ja que um objeto não existe em si.

Z

evertonsilvagomesjava:
Nessa linha aqui nao gera excessao n?

17. A a2=(A)m; // um objeto A não é um objeto "Min", e nessa linha um objeto "Min" passaria no teste de instaceof tanto para B quanto para Min, nao?

Não gera porque é null e a validação ocorre em runtime.

luciano2

Só da exception se m tiver carregado uma instancia, com m é null então se trata de um Cast de null para “A”

evertonsilvagomesjav

luciano@@:
Só da exception se m tiver carregado uma instancia, com m é null então se trata de um Cast de null para “A”

Entao mas eu digo ClassCastException mesmo nessa linha

A a = (A)m ==> A a = (A)null;

.

aqui m nao deixa de ser null n?

pmlm

[quote=evertonsilvagomesjava]
aqui m nao deixa de ser null n?

Não, porque pela linha anterior b é null… :slight_smile:

luciano2

m é null preste atenção no código.

14. Min m=null; 15. b=(C)m; 16. m=(Min)b;

evertonsilvagomesjav
[quote=luciano@@]m é null preste atenção no código.

[code]14. Min m=null; 
15. b=(C)m; 
16. m=(Min)b;
[/quote]

Entao minha duvida é a seguinte

c referencia um objeto..

b = (C)m; // aqui nao ficaria b = new C();

nao seria isso?

luciano2

Não,

Isso é um cast

m = null , ele converte m para C

é com setar b = null

sergiotaborda

Zuvirandu:
evertonsilvagomesjava:
Nessa linha aqui nao gera excessao n?

17. A a2=(A)m; // um objeto A não é um objeto "Min", e nessa linha um objeto "Min" passaria no teste de instaceof tanto para B quanto para Min, nao?

Não gera porque é null e a validação ocorre em runtime.

bom, é preciso ter cuidado. Na boa verdade a validação acontece em tempo de compilação. Acontece também em runtime, mas em tempo de compilação tb ( lembrar que java é fortemente tipado).

O que acontece ali é que está sendo usado um cast. O cast significa “compilador, esquece as regras, confia em mim”. Protanto, o compilador ignora o fato de A não ser do mesmo tipo de m. Isto não tem nada que ver com o null.

O null sim, só é verificado em runtime. e em runtime, qq variável pode ser null.

Criado 31 de maio de 2010
Ultima resposta 31 de mai. de 2010
Respostas 11
Participantes 6