Problema no metodo Listar() de Agenda...Trabalho da facul

Ai galera tou desenvolvendo uma agenda basica…
Mais na hora que eu chamo a função listar() ela executa entao de acordo com o codigo logo apos vem a chamada da função menu()…Só que dai da o seguinte erro…

-CODIGO RODANDO-

init:
deps-jar:
Deleted 1 out of date files in 0 seconds
Compiling 2 source files to D:\Heladio\Estudos\Java\NetBeansProjects\Agenda\build\classes
compile:
run:
----------AGENDA----------

1 - Inserir
2 - Listar

1
----------INSERIR----------

Quantidade de cadastros:

2
Post: 1
Nome:
Heladio
Idade:
21
Telefone:
555
Post: 2
Nome:
Lucas
Idade:
21
Telefone:
666
----------AGENDA----------

1 - Inserir
2 - Listar

2
----------LISTAR----------

Nome: Heladio
Nome: 21
Nome: 555
Nome: Lucas
Nome: 21
Nome: 666
Exception in thread “main” java.lang.NullPointerException
at agenda.agenda.listar(agenda.java:64)
at agenda.agenda.menu(agenda.java:30)
at agenda.agenda.inserir(agenda.java:57)
at agenda.agenda.menu(agenda.java:27)
at agenda.Main.main(Main.java:21)
Java Result: 1
BUILD SUCCESSFUL (total time: 17 seconds)

eu queria saber como faço pra nao dar mais esse erro e retornar pra função menu…

Aqui vai o codigo:

-----------------------------------CLASSE MAIN---------------------------------------------------



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda;

/**
 *
 * @author Heladio
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        agenda agend=new agenda();
        agend.menu();
        
        
        
        
        
        
    }

}


----------------------------------------------CLASSE PESSOAS--------------------------------------------------


package agenda;

/**
 *
 * @author Heladio
 */
public class pessoas {
    
String nome;
int idade;
int tel;


pessoas() {}  

pessoas(String name, int year, int tell) {
    nome=name;
    idade=year;
    tel=tell;
}

public void setNome(String name){
    nome=name;    
}    
    
public String getNome(){
    return nome;
}
    
public void setIdade(int year){
    idade=year;
}

public int getIdade(){
    return idade;
}

public void setTelefone(int tell){
    tel=tell;
}

public int getTelefone(){
    return tel;
}  
    

}

------------------------------------------CLASSE AGENDA-----------------------------------------------------


package agenda;

import java.util.Scanner;
import javax.swing.JOptionPane;
import java.lang.String;
import java.lang.System;



public class agenda {
    
    Scanner ler = new Scanner(System.in);
    static pessoas pessoa[] = new pessoas[100];    
    
    public void menu(){
    
        System.out.println("----------AGENDA----------\n");
        System.out.println("1 - Inserir\n2 - Listar\n");
        
        switch(ler.nextInt()){
        case 1: 
            inserir();
            break;
        case 2:
            listar();
            break;  
            
        }        
    }    
    
    public void inserir(){
    int y;
    int x=0;
    int cod;
    
    System.out.println("----------INSERIR----------\n");    
    System.out.println("Quantidade de cadastros: \n");
    y=ler.nextInt();
    
    for(int i=0;i<y;i++){    
    pessoa[x]=new pessoas();
    cod=x+1;
    System.out.printf("Post: %d\n", cod);
    System.out.println("Nome: ");
    pessoa[x].setNome(lerString());
    System.out.println("Idade: ");
    pessoa[x].setIdade(lerInt());
    System.out.println("Telefone: ");
    pessoa[x].setTelefone(ler.nextInt());
    x++;
    }
    menu();    
    }
    
    public void listar(){
    
    System.out.println("----------LISTAR----------\n");
    for(int i=0;i<pessoa.length;i++){
    System.out.printf("Nome: %s\n", pessoa[i].getNome());
    System.out.printf("Nome: %d\n", pessoa[i].getIdade());
    System.out.printf("Nome: %d\n", pessoa[i].getTelefone());
    }
    menu();
            
    }
    
    
    
        
    public static String lerString(){
    // método que lê Strings de entrada.

    Scanner leitorString = new Scanner(System.in);
    return leitorString.nextLine();
    }
    
    public static int lerInt(){
    // método que le Inteiros de entrada.

    Scanner leitorInt = new Scanner(System.in);
    return leitorInt.nextInt(); 
    }
    
    
    
}

No seu método listar você precisa verificar se a posição do array tem algum valor - if (pessoa[i] != null)… - antes de imprimir. Isso evitará NullPointerException’s. Outra solução (mais adequada, mas acho que não vem ao caso por ser um trabalho) é usar a API Collections, fornecida com o JRE (mais especificamente a classe ArrayList).

Você está declarando um array de 100 pessoas e está tentando acessar uma posição que está referenciando para null dentro do array.

Tenta assim:

 public void listar(){  
      
    System.out.println("----------LISTAR----------\n");  
    for(int i=0;i<pessoa.length;i++){  
   if(pessoa[i]!=null){//Verifica se tem um objeto na posição do array.
     System.out.printf("Nome: %s\n", pessoa[i].getNome());  
    System.out.printf("Nome: %d\n", pessoa[i].getIdade());  
    System.out.printf("Nome: %d\n", pessoa[i].getTelefone()); 
     }
 
    }  
    menu();  
              
    }  

se for continuar com arrays, aconselho na sua classe Agenda criar um campo chamado de count e nesse campo, dar um incremento a cada dado inserido… assim ficaria assim

Tomando como referencia as linhas no código colado aqui neste psot

adcione a linha 14 da agenda

private int count = 0;

exclua a linha 33

modifique as linhas 41,45,47,49,50 trocando onde tem "x" por "count"

altere a linha 58 trocando " < pessoa.length" por " < count" ficando algo assim

for(int i=0;i<count;i++){

assim, vc tera um contador, da quantidade de registros da sua agenda, e poderar saber quantos registros tem…

Existe outra alterantiva, leia abaixo

esse forma vai limitar sua agenda a 100 registros, vc não poderar alterar isso da forma que esta, e mesmo que não tenha os 100 registros, seu programa vai guardar na memoria espaço para sem registros… caso queira da pra ir mudando o tamanho da array a cada passagem de inserir(), usando "array copy" e criando um nova array, mais é algo um pouquinho mais complexo, que vai requerer um estudo maior seu…

vc pode ainda usar Collection, List, ArrayList, e outros recursos, que ja tenham implementados o sistema de array copy e etc, ai c kizer usar essas outras forma da um toque…

espero ter ajudado

[quote=Lavieri]se for continuar com arrays, aconselho na sua classe Agenda criar um campo chamado de count e nesse campo, dar um incremento a cada dado inserido… assim ficaria assim

Tomando como referencia as linhas no código colado aqui neste psot

adcione a linha 14 da agenda

private int count = 0;

exclua a linha 33

modifique as linhas 41,45,47,49,50 trocando onde tem "x" por "count"

altere a linha 58 trocando " < pessoa.length" por " < count" ficando algo assim

for(int i=0;i<count;i++){

assim, vc tera um contador, da quantidade de registros da sua agenda, e poderar saber quantos registros tem…

Existe outra alterantiva, leia abaixo

esse forma vai limitar sua agenda a 100 registros, vc não poderar alterar isso da forma que esta, e mesmo que não tenha os 100 registros, seu programa vai guardar na memoria espaço para sem registros… caso queira da pra ir mudando o tamanho da array a cada passagem de inserir(), usando "array copy" e criando um nova array, mais é algo um pouquinho mais complexo, que vai requerer um estudo maior seu…

vc pode ainda usar Collection, List, ArrayList, e outros recursos, que ja tenham implementados o sistema de array copy e etc, ai c kizer usar essas outras forma da um toque…

espero ter ajudado
[/quote]
Quanto a solução do contador é bem mais interessante que fazer o loop no array inteiro. Mas e se houvessem 15 pessoas e o usuário removesse a pessoa na posição 3. O contador iria para 14 e teríamos um NullPointerException. O mais correto é usar Collections mesmo. Mas é bem interessante dar uma lida na apostila CS-14 da Caelum que trata exatamente sobre isso.