Voltando ao básico - Qual diferença entre objeto.toString() e typecast (String) objeto

Bom, programando em jsf apareceu um problema besta, que me fez retornar ao básico do java.

Qual a diferença entre usar o método .toString() do objeto ou tentar um typecast?

Sendo mais prático:


public static void main(String[] args) {

        Object objeto = null;        
        String typecast; 
        String paraString;
        
        typecast = (String) objeto; //funciona perfeito. A variavel typecast agora é null.
        paraString = objeto.toString(); //deu java.lang.NullPointerException

    }

Agardeço qualquer ajuda

(String)objeto é uma tentativa de fazer um downcast, onde vc assume o risco de que o objeto que esta ali com certeza é um String (caso contrario ganhara uma bela ClassCastException.

.toString é qdo vc quer exibir a REPRESENTACAO STRING de um objeto.
Eu poderia pegar um objeto UnidadeFederativa, por exemplo, que tem ID, NOME e SIGLA, e dizer que a representação string dele é:

public String toString() {
   return this.sigla;
}

Dessa maneira, vc passando esse objeto pra um System.out.println por exemlo, ou adicionando o objeto numa comboBox swing, aparecera somente a Sigla.
Se vc nao subsrcrever o .toString na sua classe, ele retornaria algo como unidadefederativa@23d45

No seu caso deu NPE pq vc tentou invocar um metodo numa referencia nula.

Bom nessa parte acho que entendi, em suma “chamar um metodo em um objeto nulo dá erro, pois estava tentando chamar algo num lugar onde nao existe qualquer coisa”?

Já o do typecast ainda fiquei meio em duvida :roll: Pois sempre pensei que ao fazer b objeto[/b], o java invocava o .toString() do mesmo.

Qual anologia poderia usar?

falow e grato pela paciencia

Você chamar o método toString de algo que é nulo obviamente vai dar null pointer exception. Fazer cast para de algo para String você tem que estar certo de que aquilo é uma String, ou subclasse dela. Não é a mesma coisa.

Agora, String é uma classe final, logo o cast só vai funcionar se for uma String no fim das contas, não?

Só deveria funcionar nesses casos:

[code]Object o = new String(“teste”);
Serializable s = new String(“teste”);
Comparable c = new String(“teste”);

String str;
str = (String) o;
str = (String) s;
str = (String) c;[/code]

Sim, eu não parei para pensar que a String é final, eu pensei foi conceitualmente. Eu nunca vi ninguém querer criar uma subclasse de String anyway…

Claro, claro, só quis dizer que cast de string é um caso bem específico. Geralmente vc faz nesses poucos casos.