Arraylist

oi

tava tentando fazer um historico de de livros requisitados num ArrayList na minha bibliotecamas tá dando uns erros e não sei como emendar…

variaveis de instancia

construtor da class

public Utentes(String nome,String codigo,String telefone,String morada,String ano_nascimento)
    {
    this.nome=nome;
    this.codigo=codigo;
    this.telefone=telefone;
    this.morada=morada;
    this.ano_nascimento=ano_nascimento;
    ArrayList<Obra> obras_requisitadas = new ArrayList();
    ArrayList<Obra> posse_emprestimo = new ArrayList();
    obras_requisitadas=null;
    posse_emprestimos=null;
}

Variaveis de instancia


 String nome;
    String codigo;
    String telefone;
    String morada;
    String ano_nascimento;
    ArrayList<Obra> obras_requisitadas;
    ArrayList<Obra> posse_emprestimos;

metodos que trabalham com os arraylists

public void addJaRequisitados(Obra item){obras_requisitadas.add(item);}
       
    public ArrayList<Obra> getObras_ja_requisitadas(){return obras_requisitadas;} 
    
    public void addPosse_emprestimos(Obra item){posse_emprestimos.add(item);}
       
    public ArrayList<Obra> getObras_em_sua_posse(){return posse_emprestimos;}

só que ao adicionar a obra ele tá dando erro…

“nullPointerException
null”

se puderem dar uma olhada e postar qualquer coisa agradecia…

Obrigado

-TUGA-

Sou sempre eu que pego seus tópicos hein heheh

o problema esta no seu construtor:

    ArrayList<Obra> obras_requisitadas = new ArrayList();
    ArrayList<Obra> posse_emprestimo = new ArrayList();
    obras_requisitadas=null;
    posse_emprestimos=null; 

Vc instancia um ArrayList para obras_requisitadas e posso_emprestimo mas depois seta eles como null… logo da nullPointer quando vc executa o método add deles… tira essas duas linhas:

    obras_requisitadas=null;
    posse_emprestimos=null; 

Que o treco deve funcionar…

Flw!

você realmente é um cara de sorte, hehehehe

normalmente (99%) das vezes que responde ao meu tópico você tem razão e me sugere uma solução que resolve o meu erro, mas desta vez não resolveu, deu na mesma o erro, o mesmo erro…

se puderem dar uma ajuda…

postem aí algo

Obrigado

**se quiser eu lhe envio o projecto todo para o seu mail…

-TUGA-

Tuga50,

Se você puder postar a classe e o erro (mais precisamente a linha em que está ocorrendo) ficaria mais fácil :lol:

Valeu

É… se o erro ocorre no addJaRequisitados:

public void addJaRequisitados(Obra item) {
   obras_requisitadas.add(item);
} 

A unica forma de dar erro é se o atributo ‘obras_requisitadas’ estiver nulo…
Você pode debugar esse trecho ai, ou se não souber debugar, coloca um Sysout antes de adicionar só para chegar isso:

public void addJaRequisitados(Obra item) {
   System.out.println(obras_requisitadas);
   obras_requisitadas.add(item);
} 

Se aparecer null no console é porque em algum lugar na sua classe vc esta setando esse atributo como nulo.
De qualquer forma… se ainda tah dando erro nesse ponto e vc não conseguir achar, só postando mais código para achar.

valeu!

faz o output de “null” na janela e depois dá erro…vou postar a class toda para ter uma visão melhor…


import java.util.*;
import java.io.*;


public abstract class Utentes implements Cloneable
{
    String nome;
    String codigo;
    String telefone;
    String morada;
    String ano_nascimento;
    ArrayList<Obra> obras_requisitadas;
    ArrayList<Obra> posse_emprestimos;
    
    
    
     public Utentes(){
         nome = "";
         codigo = "";
         telefone = "";
         morada = "";
         ano_nascimento = "";
         obras_requisitadas = new ArrayList<Obra>();
         posse_emprestimos = new ArrayList<Obra>();
        }
    
    
    
    
    public Utentes(String nome,String codigo,String telefone,String morada,String ano_nascimento)
    {
    this.nome=nome;
    this.codigo=codigo;
    this.telefone=telefone;
    this.morada=morada;
    this.ano_nascimento=ano_nascimento;
    ArrayList<Obra> obras_requisitadas = new ArrayList();
    ArrayList<Obra> posse_emprestimo = new ArrayList();
    
}


    public Utentes(Utentes y){
        
    nome=y.getNome();
    codigo=y.getCodigo();
    telefone=y.getTelefone();
    morada=y.getMorada();
    ano_nascimento=y.getAno_de_nascimento();
    obras_requisitadas = y.getObras_ja_requisitadas();
    posse_emprestimos = y.getObras_em_sua_posse();
    
    }
    
    
    public String getNome(){return nome;}
       
    public String getCodigo(){return codigo;}
       
    public String getTelefone(){return telefone;}
       
    public String getMorada(){return morada;}
     
    public String getAno_de_nascimento(){return ano_nascimento;}
    
    public void addJaRequisitados(Obra item){
        System.out.println(obras_requisitadas);
        obras_requisitadas.add(item);}
       
    public ArrayList<Obra> getObras_ja_requisitadas(){return obras_requisitadas;} 
    
    public void addPosse_emprestimos(Obra item){
        System.out.println(posse_emprestimos);
        posse_emprestimos.add(item);}
       
    public ArrayList<Obra> getObras_em_sua_posse(){return posse_emprestimos;}
    
    public void Entrega_obra(Obra item){posse_emprestimos.remove(item);}
       
       
       
       public String toString()
       {
           StringBuilder s = new StringBuilder();
           s.append("-------------------------------\n");
           s.append("Nome: "+nome+"\n");
           s.append("Codigo: "+codigo+"\n");
           s.append("Morada: "+morada+"\n");
           s.append("Telefone: "+telefone+"\n");      
           s.append("Ano de nascimento: "+ano_nascimento+"\n");
           s.append("Obras requisitadas: "+obras_requisitadas+"\n");
           s.append("Obras em sua posse: "+posse_emprestimos+"\n");
           return s.toString();
       }
       
       public abstract Utentes clone();
    }

metodo que requisita


public void RequisitarLivro(String codigo_aluno,String codigo_obra){
       
       boolean requisitar = true;
       Utentes x;
       Obra y;
       
       if(existeUtente(codigo_aluno))
                    if(existeObra(codigo_obra)){
                        y = (Obra) material.get(codigo_obra);
                               if(y.getRequisitado()!=true){
                                                        
                                   
                                        Data d = new Data();
                                        x = (Utentes) utente.get(codigo_aluno);
                                        y.setRequisitado(requisitar);
                                        x.addPosse_emprestimos(y);
                                        x.addJaRequisitados(y);
                                        y.setData_requisicao(d.getDia(), d.getMes(), d.getAno());
                                        }}
                                else
                                    System.out.println("A obra está requisitada ou códigos est~ºao errados");
}

o erro ocorre na class Utentes no metodo “addPosse_emprestimos(y)” e o erro é “nullpointerException null”

vejam se descobrem alguma coisa por aí…se precisarem mais alguma coisa…

O problema provavelmente esta em:

                                        x = (Utentes) utente.get(codigo_aluno); 

Esse utente que deve vir do método get deve estar com obras_requisitadas e posse_emprestimos = null… vendo os construtores dessa classe, deve estar executando esse:

    public Utentes(Utentes y){
       
    nome=y.getNome();
    codigo=y.getCodigo();
    telefone=y.getTelefone();
    morada=y.getMorada();
    ano_nascimento=y.getAno_de_nascimento();
    obras_requisitadas = y.getObras_ja_requisitadas();
    posse_emprestimos = y.getObras_em_sua_posse();
    } 

Tenta fazer uma dessas duas alterações:

Alterar esse construtor dessa forma:

    public Utentes(Utentes y){
        nome=y.getNome();
        codigo=y.getCodigo();
        telefone=y.getTelefone();
        morada=y.getMorada();
        ano_nascimento=y.getAno_de_nascimento();
        obras_requisitadas = y.getObras_ja_requisitadas();
        posse_emprestimos = y.getObras_em_sua_posse();
        if(obras_requisitadas == null)
            obras_requisitadas = new ArrayList<Obra>();
        if(posse_emprestimos == null)
            posse_emprestimos = new ArrayList<Obra>();
    } 

Ou

alterar os métodos get dessas listas:

    public ArrayList<Obra> getObras_ja_requisitadas(){
        if(obras_requisitadas == null)
             obras_requisitadas = new ArrayList<Obra>();
        return obras_requisitadas;
    }
          
    public ArrayList<Obra> getObras_em_sua_posse(){
          if(posse_emprestimos == null)
               posse_emprestimos = new ArrayList<Obra>();
         return posse_emprestimos;
    }

Ah, agora que eu vi que vc obriga os filhos de Utentes a implementar clone… será que vc esta implementando clone corretamente?! clonando inclusive essas listas?!

E sendo Utentes uma classe abstrata, todas suas implementações são classes “filhas”, e como seus atributos não são private, sera que nenhuma dessas classes filhas (no construtor provavelmente) está setando esses arraylist como null?!

No geral… achei bem estranho a arquitetura das suas classes, é que esta meio confuso… mas isso vc vai vendo com o tempo e refatorando…

flw!

5 estrelas lubs…dá certinho…mas agora é outro metodo que não bate certo…

metodo que envia a a data de reuisição

y.setData_requisicao(d.getDia(), d.getMes(), d.getAno());

metodo que recebe o metodo de cima

public void setData_requisicao(int di, int me, int an){diar=di;mesr=me;anor=an;}

estes são as mesmas que o de cima…

y.setData_entrega(d.getDia(), d.getMes(), d.getAno());
public void setData_entrega(int di, int me, int an){diae=di;mese=me;anoe=an;}

envia o código da obra à função seguinte

Preco_emprestimo(y.getCodigo());

metodo que calcula o preço de emprestimo

 public void Preco_emprestimo(String codigo_obra){
                
                double preco=0.0;
                int dias=0;
                
                Obra y = (Obra) material.get(codigo_obra);
                
                if(y.AnoE()==y.AnoR())
                    dias=dias;
                else
                    dias=dias+365*(y.AnoE()-y.AnoR());
                    
                if(y.MesE()==y.MesR())
                    dias=dias;
                else
                    dias=dias+30*(y.MesE()-y.MesR());
                    
                if(y.DiaE()==y.DiaR())
                    dias=dias;
                else
                    dias=dias+(y.DiaE()-y.DiaR());
                    
                    
               preco = dias*y.getPreco_por_dia();
                    
                    
                    System.out.println("O preço do emprestimo é de "+preco+"€");
            }

mesmo antes de fazer a entrega quando faço o inspect do objecto ele fica em “0”…

se encontrarem algum erro por aí postem aí qualquer coisa…

Obrigado

-TUGA-

Porque vc usa um objeto Date?! ao inves de setar dia, mes e ano?!
Depois para calcular a quantidade de dias entre as duas datas, le qualquer um desses links:

http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=39260
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=38907
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=31639