(RESOLVIDO) Problemas com ArrayList

18 respostas
fvargas_tkd

Pessoal, estou encontrando dificuldades pra usar ArrayList em um trabalho para faculdade, não estou conseguindo resolver o problema e preciso de uma ajuda de voces pra entender como isso funciona.

O que acontece é o seguinte:
Na classe main eu uso esse método para adicionar um funcionario:

faqi.addFunc(funcionario);

Na classe Biblioteca, que é onde tenho criado esse método eu tenho o seguinte:

ArrayList fun = new ArrayList();
// Adiciona Funcionario
    public void addFunc(Funcionarios f) {        
        fun.add(f);
    }

Para retornar o objeto eu montei assim:

// Pega o Funcionario
    public Funcionarios getFunc(int cpf){       
            for (int i =0; i < fun.size(); i++){
            Funcionarios tempFunc = null;
            tempFunc =  (Funcionarios) fun.get(i);
            if (tempFunc.getCpf() == cpf){
                    return tempFunc;
            }
        }
    return null;
    }

O problema é que dá o seguinte erro, como se o ArrayList estive vazio, usando o metodo size ele retorna 0, alguém pode me ajudar?

java.lang.NullPointerException

18 Respostas

G
// Pega o Funcionario
    public Funcionarios getFunc(int cpf){       
            for (int i =0; i < fun.size(); i++){
            Funcionarios tempFunc = null;
            tempFunc =  (Funcionarios) fun.get(i);
            System.out.println(tempFunc.getCpf() + "é igual" + cpf );
            if (tempFunc.getCpf() == cpf){
                    return tempFunc;
            }
        }
    return null;
    }

Outra coisa:
De onde vem esse “fun” dentro do for?

ve aí.

fvargas_tkd

Mesmo erro meu amigo, nada feito…o fun dentro do for é o arraylist que armazenas os funcionarios …
mais na parte de cima desta página vc consegue ver ele …

cdorner

fvargas_tkd:
Mesmo erro meu amigo, nada feito…o fun dentro do for é o arraylist que armazenas os funcionarios …
mais na parte de cima desta página vc consegue ver ele …

precisa colocar o codigo todo assim nao da pra ver oq esta acontecendo

G

Ta, blz, mas o que saiu no console com o sysout que vc colocou?

flw.

fvargas_tkd

Código da classe Biblioteca:

import java.util.*;

public class Biblioteca {

   public ArrayList<Object> fun = new ArrayList<Object>(); // Array dos Funcionarios
   private ArrayList usu = new ArrayList(); // Array dos Usuarios
   private ArrayList liv = new ArrayList(); // Array dos Livros
   private String biNome;

    public Biblioteca (String nome) {
        this.biNome = nome;
    }
   
/*------------Funcionario-------------------------------------*/
    
// Adiciona Funcionario
    public void addFunc(Funcionarios f) {        
        fun.add(f);
            int teste = fun.size();
            System.out.println("Ao adicionar ArrayList agora, o tamanho é: " + teste);       
    }
    


    // Remove Funcionario
    public void remFunc(int cpf) {
        Funcionarios tempFunc = null;
        for (int i = 0; i < fun.size(); i++) {
            tempFunc= (Funcionarios) fun.get(i);
            if (tempFunc.getCpf() == cpf) {
                fun.remove(i);
            }
        }
    }

    // Pega o Funcionario
//    public Funcionarios getFunc(int cpf){
//        int size = fun.size();
//        System.out.println("O tamanho do ArrayList é: " + size);
//
//        for (int i =0; i < fun.size(); i++){
//            Funcionarios tempFunc = null;
//            tempFunc =  (Funcionarios) fun.get(i);
//            if (tempFunc.getCpf() == cpf){
//                    return tempFunc;
//            }
//        }
//    return null;
//    }

        // Pega o Funcionario
    public Funcionarios getFunc(int cpf) {
        Funcionarios tempFunc = null;
        for (int i = 0; i < fun.size(); i++) {
//            Funcionarios tempFunc = null;
            tempFunc = (Funcionarios) fun.get(i);
            if (tempFunc.getCpf() == cpf) {
                return tempFunc;
            }
        }
        return tempFunc;
    }

    public Funcionarios returnFunc(int cpf) {
        Iterator i = fun.iterator();
        while (i.hasNext()) {
            Funcionarios func = (Funcionarios) i.next();
            if (func.getCpf() == cpf) {
                return func;
            }
        }
        return null;
    }


    /*------------Usuario-------------------------------------*/

    // Adiciona Usuario
    public void add_Usu(Usuarios usuario) {
            usu.add(usuario);
      
    }

    // Remove Usuario
     public void removeUsu (int cpf) {
        Usuarios temp = null;
        for (int i=0; i< usu.size(); i++) {
            temp = (Usuarios) usu.get(i);
            if(temp.getCpf() == cpf) {
                usu.remove(i);
            }
        }
    }

     // Pega Usuario
    public Usuarios getUsu (int cpf) {
        Usuarios tmpUsuario = null;
        for( int i=0 ; i < usu.size() ; i++) {            
            tmpUsuario = (Usuarios) usu.get(i);
            if (tmpUsuario.getCpf() == cpf) {
                    return tmpUsuario;
                }
        }
        return null;
    }


/*------------Livro-------------------------------------*/

// Adiciona Livro
    public void add_Livro(Livros livro) {
            liv.add(livro);
    }

    // Remove o livro
    public void remove_Livro(String titulo) {
        Livros book = null;
        for (int i = 0; i < liv.size(); i++) {
            book = (Livros) liv.get(i);
            if (book.getTitulo() == titulo){
                liv.remove(i);
            }
        }
    }

// Pega o livro
    public Livros getLivro (String titulo) {
        Livros book = null;
        for (int i=0; i < liv.size(); i++) {
            book = (Livros) liv.get(i);
            if (book.getTitulo() == titulo){
                return book;
            }
        }
    return null;
    }

    // Faz a locação
    public boolean locacao (int cpf, String titulo) {
        Usuarios usuario = this.getUsu(cpf);
        Livros livro = this.getLivro(titulo);
        livro.setLocador(usuario);
        return true;
    }

    // Faz a devolução
    public boolean devolucao (String titulo) {       
        Livros livro = this.getLivro(titulo);
        livro.setLocador(null);
        return true;
    }

    public ArrayList getLivrosLocados (int cpf){
        ArrayList retorno = new ArrayList();
            //for...{} testar em cada livro se o locador tem o mesmo cpf para retornar todos os livros locados por alguem, usar como base o get ...


        return retorno;
    }



   
}

Código da classe main:

import java.util.*;
import javax.swing.*;

public class Main {

//    ArrayList fun = new ArrayList();
    static int opcao;

    public static void main(String[] args) {

        try {
            do {

                Biblioteca faqi = new Biblioteca("faqi");

                opcao = Integer.parseInt(JOptionPane.showInputDialog(" O que voce deseja fazer? " + "\n" +
                        " 1 - Criar e Adicionar um Funcionario" + "\n" +
                        " 2 - Criar e Adicionar um Usuario" +
                        "\n" + " 3 - Criar e Adicionar um Livro" +
                        "\n" + " 4 - Buscar Funcionario" +
                        "\n" + " 5 - Buscar Usuario" +
                        "\n" + " 6 - Buscar Livro" +
                        "\n" + " 7 - Remover Funcionario" +
                        "\n" + " 8 - Remover Usuario" +
                        "\n" + " 9 - Remover Livro" +
                        "\n" + " 10 - Locar Livro" +
                        "\n" + " 11 - Devolver Livro" +
                        "\n" + " 0 - Sair do sistema"));

                switch (opcao) {

                    case 1:
                        // Adiciona Funcionario
                        String nome = JOptionPane.showInputDialog("Informe o nome: ");
                        int cpf = Integer.parseInt(JOptionPane.showInputDialog("Informe o cpf: "));

                        Funcionarios funcionario = new Funcionarios(cpf);
                            funcionario.setNome(nome);
                            funcionario.setCpf(cpf);

                        int cep = Integer.parseInt(JOptionPane.showInputDialog("Informe o cep: "));
                        Endereco ender = new Endereco(cep);
                            ender.setCep(cep);
                        String rua = JOptionPane.showInputDialog("Informe a rua: ");
                            ender.setRua(rua);
                        String bairro = JOptionPane.showInputDialog("Informe o bairro: ");
                            ender.setBairro(bairro);
                        String cidade = JOptionPane.showInputDialog("Informe a cidade: ");
                            ender.setCidade(cidade);
                        String complemento = JOptionPane.showInputDialog("Informe o complemento: ");
                            ender.setComplemento(complemento);
                            funcionario.setEndereco(ender);
//                            faqi.fun.add(funcionario);
                            faqi.addFunc(funcionario);
                        
                        System.out.println("Opção 1, criar e adicionar Funcionario");
                        break;


                    case 2:

                        String nomeUsu = JOptionPane.showInputDialog("Informe o nome: ");
                        int cpfUsu = Integer.parseInt(JOptionPane.showInputDialog("Informe o cpf"));
                        int cepUsu = Integer.parseInt(JOptionPane.showInputDialog("Informe o cep: "));
                        Usuarios usuario = new Usuarios(cpfUsu);
                            usuario.setNome(nomeUsu);
                            usuario.setCpf(cpfUsu);
                        Endereco enderUsu = new Endereco(cepUsu);
                            enderUsu.setCep(cepUsu);
                        String ruaUsu = JOptionPane.showInputDialog("Informe a rua: ");
                            enderUsu.setRua(ruaUsu);
                        String bairroUsu = JOptionPane.showInputDialog("Informe o bairro: ");
                            enderUsu.setBairro(bairroUsu);
                        String cidadeUsu = JOptionPane.showInputDialog("Informe a cidade: ");
                            enderUsu.setCidade(cidadeUsu);
                        String complementoUsu = JOptionPane.showInputDialog("Informe o complemento: ");
                            enderUsu.setComplemento(complementoUsu);
                        faqi.add_Usu(usuario);
                        System.out.println("Opção 2, criar e adicionar Usuario.");

                        break;


                    case 3:

                        String titulo = JOptionPane.showInputDialog("Informe o Título do Livro: ");
                        String autor = JOptionPane.showInputDialog("Informe o Autor do Livro: ");
                        int ano = Integer.parseInt(JOptionPane.showInputDialog("Informe o Ano do Livro: "));
                        Livros livro = new Livros(titulo);
                            livro.setTitulo(titulo);
                            livro.setAutor(autor);
                            livro.setAno(ano);
                        faqi.add_Livro(livro);
                        System.out.println("Opção 3, Criar e adicionar Livro");

                        break;

                    case 4:
                            // Mostra o funcionário
                         int cpfFunc = Integer.parseInt(JOptionPane.showInputDialog("Informe o CPF do Funcionário: "));
                         Funcionarios func = faqi.getFunc(cpfFunc);
                         String teste = func.getNome();
                         System.out.println("Teste é: " + teste);
//                         JOptionPane.showMessageDialog(null, "O Funcionário é: " + func.getNome());
                         JOptionPane.showMessageDialog(null, "Funcionário: " + func.getNome());


                        break;

                    case 5:
                        break;

                    case 6:
                        break;

                    case 7:
                        break;

                    case 8:
                        break;

                    case 9:
                        break;

                    case 10:
                        break;

                    case 11:
                        break;

                }






            } while (opcao != 0);
        } catch (Exception e) {
            System.out.println("Erro: " + e);
            JOptionPane.showMessageDialog(null, "Erro: " + e);
        }
    }
}
janjan

!!!

fvargas_tkd

Boa idéia sim amigo, tentei aqui, agora está mostrando no painel:

Funcionário: null

Lavieri

NullPinterException sem o stacktrace é complicado de ver onde ocorreu…

provavelmente seu erro esta aqui

public void addFunc(Funcionarios f) { fun.add(f); }

vc tem um método que não se protege contra funcionarios nulos… o correto seria

public void addFunc(Funcionarios f) { if (f == null) throw new IllegalArgumentException("Não é possivel adcionar um funcionário nulo!"); fun.add(f); }

a outra solução seria … se não for nulo, adciona, se não não faz nada, o que na minha opinião é pior

public void addFunc(Funcionarios f) { if (f != null) fun.add(f); }

fvargas_tkd

Mesma coisa meu amigo, continua retornando null …

Lavieri

ahh outra coisa, a forma de vc realizar a busca na lista sua Collection, poderia ser algo + coeso, ou seja, vc poderia separar as responsabilidades e delegar a cada parte uma tarefa especifica… e sendo ainda + claro, sua busca poderia ser assim

public Funcionarios getFunc(int cpf){ return CollectionUtils.findFirst(fun,criterionByCpf(cpf)); }

se quiser + informações de como fazer assim… fala q te explico rapidim ^^

Lavieri

so pode estar dando null por um dos dois motivos… ou fun == null, o que não deve ser, pq pelo código q vc postou, ela é iniciada…

ou fun contém funcionarios nulos, gerando a exceção na hora da busca

KD o StackTrace ?

fvargas_tkd

Não rolou, pediu para criar a classe: CollectionUtils…gente que coisa de loco isso, uma coisa tão simples ficar tão complicada, estou desde ontem em cima dessa encrenca, não dá pra acreditar …

Lavieri

fvargas_tkd:
Não rolou, pediu para criar a classe: CollectionUtils…gente que coisa de loco isso, uma coisa tão simples ficar tão complicada, estou desde ontem em cima dessa encrenca, não dá pra acreditar …

sim, pediu e era pra pedir… ailo q postei é uma forma q é possivel criar… as buscas, e separar as responsabilidades… mas primeiro vc precisa sanar o problema da nulidade… posta o stacktrace

fvargas_tkd

No meu console aparece assim:

run:

Opção 1, criar e adicionar Funcionario

O tamanho do ArrayList é: 0

java.lang.NullPointerException

at Main.main(Main.java:106)

Erro: java.lang.NullPointerException

CONSTRUÍDO COM SUCESSO (tempo total: 15 segundos)

a linha 106 é essa:

JOptionPane.showMessageDialog(null, "Funcionário: " + func.getNome());
B

O método get de uma Collection retorna uma referencia para um objeto que você tiver pesquisado.

Se naquela posição não houver uma referência para um objeto válido, o valor retornado é null.

Se após o get você não checar que o valor retornado possa ser null antes de chamar qualquer método de instância dele, vai dar NullPointerException.

Portanto, coloque um if (func == null) continue; imediatamente após chamar o get.

Lavieri

fvargas_tkd:
No meu console aparece assim:

run:

Opção 1, criar e adicionar Funcionario

O tamanho do ArrayList é: 0

java.lang.NullPointerException

at Main.main(Main.java:106)

Erro: java.lang.NullPointerException

CONSTRUÍDO COM SUCESSO (tempo total: 15 segundos)

a linha 106 é essa:

JOptionPane.showMessageDialog(null, "Funcionário: " + func.getNome());

c o problema é nessa linha então é por isso hora…

int cpfFunc = Integer.parseInt(JOptionPane.showInputDialog("Informe o CPF do Funcionário: ")); Funcionarios func = faqi.getFunc(cpfFunc); //<====================== O CPF retornou NULL!! String teste = func.getNome(); System.out.println("Teste é: " + teste); // JOptionPane.showMessageDialog(null, "O Funcionário é: " + func.getNome()); if (func == null) //com esse if deve resolver JOptionPane.showMessageDialog(null, "Funcionário não encontrado"); else JOptionPane.showMessageDialog(null, "Funcionário: " + func.getNome());

fvargas_tkd

Pessoal, o que está acontecendo é o seguinte … dentro do metodo add se eu chamar o size do arraylist eu recebo o valor 1, mas se eu fizer a mesma coisa dentro do metodo getFunc, recebo 0, alguem tem uma idéia pra resolver isso …?

fvargas_tkd

Pessoal, problema resolvido. Eu tinha instanciado um objeto da classe biblioteca na classe main, dentro do Switch, coloquei lá em cima junto com as variaveis da classe principal e tudo rodou tranquilo.

Obrigado a todos pela ajuda, mais uma vez.
Grande abraço a todos e um ótimo fim de semana.

Criado 24 de abril de 2009
Ultima resposta 24 de abr. de 2009
Respostas 18
Participantes 6