Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro ao rodar o programa

Quando rodo o programa, mostra esse erro no console:

[]
[João,]
Exception in thread "main" java.lang.NullPointerException
    at ListaLigada.toString(ListaLigada.java:28)
    at java.lang.String.valueOf(Unknown Source)
    at java.io.PrintStream.println(Unknown Source)
    at TestaListaLigada.main(TestaListaLigada.java:9)

Na linha 28 da classe ListaLigada tenho:

builder.append(atual.getElemento());

Método completo:

@Override
    public String toString() {
        if (this.totalDeElemtos == 0) {
            return "[]";
        }
        Celula atual = primeira;
        StringBuilder builder = new StringBuilder("[");
        for (int i = 0; i < totalDeElemtos; i++) {
            builder.append(atual.getElemento());
            builder.append(",");
            atual = atual.getProximo();
        }
        builder.append("]");
        return builder.toString();
    }

TestaListaLigada:

public static void main(String[] args) {
        ListaLigada lista = new ListaLigada();
        System.out.println(lista);
        lista.adicionaNoComeco("João");
        System.out.println(lista);
        lista.adicionaNoComeco("Maria");
        System.out.println(lista);
        lista.adicionaNoComeco("Roberta");
        System.out.println(lista);
    }
6 respostas

Olá João, o erro indica que o objeto atual está null. Provável o problema é que a referência primeira esteja null tbem.

Aproveitando a oportuniadade, vc está usando um for para iterar numa lista encadeada. Isto não é ideal. O melhor seria algo parecido com o código abaixo:

atual = primeira; // considere q primeira aponte para a primeira celula (nao seja null)

while (atual != null) {
    // faca algo com atual
    atual = atual.getProximo();
}

Att.

Mesmo alterando para while continua o mesmo erro.

Está iniciando como null, igual o professor ensinou na aula:

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

    @Override
    public String toString() {
        if (this.totalDeElemtos == 0) {
            return "[]";
        }
        Celula atual = primeira;
        StringBuilder builder = new StringBuilder("[");
        for (int i = 0; i < totalDeElemtos; i++) {
            builder.append(atual.getElemento());
            builder.append(",");
            atual = atual.getProximo();
        }
        builder.append("]");
        return builder.toString();
    }
}

Rodrigo coloca as classes inteiras para que possa analisar em mais detalhes.

Att.

Classe Celula:

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

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

    public Celula getProximo() {
        return proximo;
    }

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

    public Object getElemento() {
        return elemento;
    }
}

Claase ListaLigada:

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

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

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

        this.totalDeElemtos++;
    }

    @Override
    public String toString() {
        if (this.totalDeElemtos == 0) {
            return "[]";
        }
        Celula atual = primeira;
        StringBuilder builder = new StringBuilder("[");
        for (int i = 0; i < totalDeElemtos; i++) {
            builder.append(atual.getElemento());
            builder.append(",");
            atual = atual.getProximo();
        }
        builder.append("]");
        return builder.toString();
    }

    public void adiciona(Object elemento) {
        if (this.totalDeElemtos == 0) {
            adicionaNoComeco(elemento);
        } else {
            Celula nova = new Celula(elemento, null);
            this.ultima.setProximo(nova);
            this.ultima = nova;
            this.totalDeElemtos++;
        }
    }

    private boolean posicaoOcupada(int posicao) {
        return posicao >= 0 && posicao < totalDeElemtos;
    }

    private Celula pegaCelula(int posicao) {
        if (!posicaoOcupada(posicao)) {
            throw new IllegalArgumentException("Posiçã inexistente.");
        }

        Celula atual = primeira;

        for (int i = 0; i < posicao; i++) {
            atual = atual.getProximo();
        }

        return atual;
    }

    public void adiciona(int posicao, Object elemento) {
        if (posicao == 0) {
            adicionaNoComeco(elemento);
        } else if (posicao == this.totalDeElemtos) {
            adiciona(elemento);
        } else {
            Celula anterior = this.pegaCelula(posicao - 1);
            Celula nova = new Celula(elemento, anterior.getProximo());
            anterior.setProximo(nova);
            this.totalDeElemtos++;
        }
    }

    public Object pega(int posicao) {
        return this.pegaCelula(posicao).getElemento();
    }

    public void removeDoComeco() {
        if (this.totalDeElemtos == 0) {
            throw new IllegalAccessError("Lista vazia");
        }
        this.primeira = this.primeira.getProximo();
        this.totalDeElemtos--;

        if (this.totalDeElemtos == 0) {
            this.ultima = null;
        }
    }

    public void remove(int posicao) {
    }

    public int tamanho() {
        return this.totalDeElemtos;
    }

    public boolean contem(Object o) {
        return false;
    }
}

Classe para testar:

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

        System.out.println(lista);
        lista.adicionaNoComeco("João");
        System.out.println(lista);
        lista.adicionaNoComeco("Maria");
        System.out.println(lista);
        lista.adicionaNoComeco("Roberta");
        System.out.println(lista);

        lista.adiciona("Marcelo");
        System.out.println(lista);

        lista.adiciona(2, "Juliana");
        System.out.println(lista);

        Object x = lista.pega(2);
        System.out.println(x);

        System.out.println(lista.tamanho());

        lista.removeDoComeco();
        System.out.println(lista);
        System.out.println(lista.tamanho());
    }
}
solução!

Rodrigo , fiz este Gist com o código que vc enviou. Compara com o teu código original.

https://gist.github.com/filosofisto/04c4178a3abbc609c9ff9b6d6a5e6a48

Espero que tenha ajudado.

Att.

Agora está funcionando, obrigado pela ajuda.