7
respostas

Inserir no final

Quando eu vou executar esse método, é retornado o seguinte erro java.lang.NullPointerException, e não sei porque pois segui exatamente o que o professor indicava na vídeo aula

    public void adicionaFinal(Object elemento) {
        if(this.totaldeelementos == 0) {
            adicionaComeco(elemento);
        }else {
        Celula nova = new Celula(elemento);
        this.ultima.setProximo(nova);
        this.ultima=nova;
        this.totaldeelementos++;
        }
    }
7 respostas

Oi Caio!!!!

Este erro significa que algum lugar do seu código veio nulo quando esperava-se encontrar um valor.

Você fez exatamente como está na aula?

Se sim, o problema é na primeira linha depois do else, quando você instancia uma nova Celula. Essa classe exige 2 argumentos, Object elemento e Celula proximo, e como você não passou o segundo argumento, significa que ele veio nulo e disparou a exception.

//Classe Celula
public class Celula {

    private Object elemento;
    private Celula proximo;

    public Celula(Object elemento, Celula proximo) {
        this.elemento = elemento;
        this.proximo = proximo;
    }
}

Sendo assim você precisa passar os 2 argumentos ao instanciar uma nova Celula: Celula nova = new Celula(elemento, null).

Logo, seu método ficaria assim:

public void adicionaFinal(Object elemento) {

    if(this.totalDeElementos == 0) {
        adicionaComeco(elemento);
    } else {
        Celula nova = new Celula(elemento, null);
        this.ultima.setProximo(nova);
        this.ultima = nova;
        this.totalDeElementos++;
    }
}

Depois me diz se funcionou!!! Espero ter ajudado!!

Bons estudos!

Da o mesmo erro, tentei das duas formas, com o null no construtor e sem ele também

Caio, se possível, por favor compartilhe o código do método main, e o erro completo disponibilizado no console (stack trace). Aproveite para compartilhar as classes Celula e ListaLigada.

//Classe Celula
    public class Celula {
    private Object elemento;
    private Celula proximo;

    public Celula (Object elemento,Celula proximo) {
        this.elemento = elemento;
        this.proximo = proximo;
    }
    public Celula (Object elemento) {
        this.elemento = elemento;
    }
    public Object getElemento() {
        return elemento;
    }

    public Celula getProximo() {
        return proximo;
    }
    public void setProximo(Celula proximo) {
        this.proximo = proximo;
    }

}

//Classe ListaLigada

public class ListaLigada {
    private Celula primeira = null;
    private Celula ultima = null;
    private int totaldeelementos = 0;

    public void adicionaComeco(Object elemento) {
        if(totaldeelementos == 0) {
            this.ultima = this.primeira;
        }
        Celula nova = new Celula(elemento,primeira);
        this.primeira = nova;
        this.totaldeelementos++;

    }
    public String toString() {
        if(this.totaldeelementos == 0) {
            return "[]";
        }
        Celula atual = primeira;

        StringBuilder buil = new StringBuilder("[");
        for(int i=0;i<this.totaldeelementos;i++) {
            buil.append(atual.getElemento());
            buil.append(",");

            atual = atual.getProximo();
        }
        buil.append("]");

        return buil.toString();
    }

    public void adicionaFinal(Object elemento) {

        if(this.totaldeelementos == 0) {
            adicionaComeco(elemento);
        } else {
            Celula nova = new Celula(elemento, null);
            this.ultima.setProximo(nova);
            this.ultima = nova;
            this.totaldeelementos++;
        }
    }
    public Celula Pega(int posicao) {
        Celula p = primeira;
        for(int i=0;i<posicao;i++) {
            p = p.getProximo();
        }
        System.out.println(p);
        return p;
    }

    public boolean Contem(int posicao) {
        return posicao>0 && posicao<=this.totaldeelementos;
    }

    public void adicionaMeio(int posicao,Object elemento) {
    if(posicao==0 || this.totaldeelementos == 0) {
        adicionaComeco(elemento);
    }else if(posicao == this.totaldeelementos){
        adicionaFinal(elemento);
    }else {
    Celula anterior = this.Pega(posicao - 1);
    Celula nova = new Celula(elemento, anterior.getProximo());
    anterior.setProximo(nova);
    this.totaldeelementos++;
    }
    }

}


//Classe TestaLista

public class TestaLista {
    public static void main(String[] args) {
        ListaLigada lista = new ListaLigada();

        lista.adicionaComeco("Caio");
        System.out.println(lista);
        lista.adicionaComeco("Carol");
        System.out.println(lista);
        lista.adicionaComeco("Jose");
        System.out.println(lista);
        lista.adicionaFinal("rafa");
        System.out.println(lista);
    }


}

//Erro do console
    [Carol,Caio,]
[Jose,Carol,Caio,]
java.lang.NullPointerException
    at ListaLigada.adicionaFinal(ListaLigada.java:40)
    at TestaLista.main(TestaLista.java:12)

Oi Caio,

o problema está na sua classe ListaLigada, no método adicionaComeco.

Da forma que está, o método está entrando direto no if e passando null para a variável this.ultima, sem alterá-la no resto do método ou outra parte do código. Posteriormente ela é chamada no método adicionaFinal, mas vai nula e dispara a excepcion.

Isso pode ser resolvido invertendo o código, conforme segue:

public void adicionaComeco(Object elemento) {
            Celula nova = new Celula(elemento,primeira);
            this.primeira = nova;

            if(totaldeelementos == 0) {
                this.ultima = this.primeira;
            }

            this.totaldeelementos++;
        }

O que acontece? Dessa forma, você instancia uma Celula com o nome nova e atribui para a variável this.primeira. Quando entrar no if, a this.ultima recebe o conteúdo da this.primeira, ou seja, o objeto nova e não fica mais nulo.

Altera e vê se resolve!! ;)

Muito obrigado, você não sabe o quanto eu bati a cabeça tentando resolver kkk, deu tudo certo agora

Que bom!!! Fico feliz!!! \o/

Só marca o tópico como solucionado para facilitar as buscas.

Qualquer dúvida, estamos a disposição ok?

Bons estudos!