Problemas de perda de dados no vetor de objeto

Olá aos colegas. Estou com um probleminha que o vetor fica nulo depois que retorno ao menu de opções,
onde mostraria os cadastros feitos em um objeto do tipo pessoa. Como tem algumas classe para se analisar
exatamente onde está o erro, coloco a pasta zipada. Estou usando a IDE Eclipse Helios 3.7

Não reparem em erros de OO, pois estou aprendendo ainda a lidar com orientação a objeto. Aceito sugestões.
Detalhe, não está completamente terminado.

Obrigado.

[quote=Armando Pereira]Olá aos colegas. Estou com um probleminha que o vetor fica nulo depois que retorno ao menu de opções,
onde mostraria os cadastros feitos em um objeto do tipo pessoa. Como tem algumas classe para se analisar
exatamente onde está o erro, coloco a pasta zipada. Estou usando a IDE Eclipse Helios 3.7

Não reparem em erros de OO, pois estou aprendendo ainda a lidar com orientação a objeto. Aceito sugestões.
Detalhe, não está completamente terminado.

Obrigado.[/quote]

Bom, parece que fica um pouco complicado ter deixado todo código em arquivo. Resolvi colocar parte dele aqui.
Até tentei mudar alguns detalhes para ver se encontrava o problema, mas sem sucesso. Então vai estar alguma
coisa diferente em relação o que está arquivado.

Aqui mando o menu, mas a ideia começa na inclusão de dados, onde chama uma classe que chamei EntradaDados

[code]public class InterfaceCliente {
int opt = 0;

EntradaDados ed = new EntradaDados();
AlterarDados ad = new AlterarDados();
Controle c = new Controle();

public void MenuOpcao(){
	
	while(opt != 5){
		
		opt = Integer.parseInt
			(JOptionPane.showInputDialog
				(null,"Digite uma opção:\n\n" + 
					  "1. Incluir dados.\n" +
					  "2. Alterar dados.\n" +
					  "3. Excluir dados.\n" +
					  "4. Sair do aplicativo\n\n" + 
					  "========  QUANTIDADE DE CADASTRO: "
					  + c.tam + "  ======\n\n" +
					 c.mostraCadastro() ,"MENU DE OPÇÕES",2));
				
				switch (opt) {
				case 1:
					ed.entrarDados();
					
					break;
				case 2:
					ad.alteraDados();
					break;
				case 3:
					JOptionPane.showMessageDialog(null,"Aguardando implementação");
					break;
				case 4:
					System.exit(0);
					break;
										
				default:
					JOptionPane.showMessageDialog(null, "Opção Inválida","MENSAGEM DE ERRO",2);
					break;
				}// fim do switch
				
		}//fim do while
	
}//fim do método			

}[/code]

Executando a EntradaDados, digita-se o Nome e o CPF, no caso, os 9 dígitos e depois os dígitos verificador.
nisso vai para o método ValidarCpf passando o parâmetro do numero e do verificador, retornando True ou False conforme
o resultado dos cálculos efetuados. Se True carrega a array pessoa[] com o tamanho - 1, pois tem um controlador da array
em uma classe Controle. bom, até aí tudo funciona, a questão é quando retorna para o Menu, sendo válido o CPF, a array
da posição carregada, retorna NULL.

[code]public class Controle {
int tam;
Pessoa[] pessoa;

public Controle(){
	tam = 0;
	pessoa = new Pessoa[4];
}	

public void dadosPessoa(Pessoa p){
	if (tam <= pessoa.length){
		pessoa[tam]=p;
		tam++;
	}else{
		tam = pessoa.length;
			
	}
}
public String mostraCadastro(){
	String mostra = "";
	
	for(int i=0;i<tam;i++)
		mostra = mostra + "Nome: " + pessoa[i].getNome() +
		"     CPF: " + pessoa[i].getNum() + "-" + pessoa[i].getDig() + "\n";
	
	return mostra;		
}

}[/code]

[code]public class EntradaDados {

Controle c = new Controle();
public void entrarDados(){
	String nome = "";
	int numero = 0;
	int digito = 0;
		Pessoa p = new Pessoa(nome,numero,digito);
		
		while(nome.length()<3){
			nome = JOptionPane.showInputDialog(null,"Digite nome","CADASTRO DE NOMES",1);
		}
	
		while(String.valueOf(numero).length()!=9){
			numero = Integer.parseInt
			(JOptionPane.showInputDialog
			(null,"Digite o numero principal","DADOS DO CPF",1));
		}
	
		while(String.valueOf(digito).length()!=2){
			digito = Integer.parseInt
			(JOptionPane.showInputDialog
			(null,"Digite digito verificador","DADOS DO CPF",1));
		}
	
		
		ValidarCpf vc = new ValidarCpf(numero,digito);
		if (vc.valCpf()==true){
			
			c.dadosPessoa(p);				
			c.pessoa[c.tam - 1].setNome(nome.toUpperCase());
			c.pessoa[c.tam - 1].setNum(numero);
			c.pessoa[c.tam - 1].setDig(digito);				
			
			JOptionPane.showMessageDialog(null, "CPF Válido","MENSAGEM AO CLIENTE",3);
			//Até vai tudo bem, o problema é quando retorna
			//para as opções de menu, onde exibiria os dados, retorna nulo
			
		}else{
			JOptionPane.showMessageDialog(null, "CPF Inválido","MENSAGEM AO CLIENTE",3);
		}
	}
}[/code]

[code]public class ValidarCpf {
public int num;
public int dv;

	public ValidarCpf(int num,int dv){
		this.num = num;
		this.dv = dv;
	}
	
	public boolean valCpf(){
		boolean ret = false;
		int dv1, dv2;
		int s1 =0,s2 = 0;
		int divx = 0;
		int indice = 0;
		
		dv1 = Integer.parseInt(String.valueOf(dv).substring(0,1));
		dv2 = Integer.parseInt(String.valueOf(dv).substring(1,2));
		divx = num;
		while(divx > 0){
    		 divx = num / 10;
    		 int mode = (num % 10);
    		 
    		 s1 = s1 + (mode * indice);
    		 s2 = s2 + (mode * (indice + 1));
    		 
    		 indice = indice + 1;
    		 num = divx;
    	 }
    	 s2 = s2 + (dv1 * 2);
    	 
    	 if( (11-(s1%11))>=10) dv1 = 0;
    	 else dv1 = (11-(s1%11));
    	 
    	 if ((11-(s2%11))>=10) dv2 = 0;
    	 else dv2 = (11-(s2%11));
    	     	 
    	 if (dv == Integer.parseInt(String.valueOf(dv1)
 	 			+ String.valueOf(dv2))) ret = true;
		
		return ret;
	}

}
[/code]

Bom, estas são as classes que envolvem o problema. Obrigado.

que vetor? o Controle voce quer dizer? Se for, deixa o Controle como Singleton e veja se resolve :wink:

Amigo, o problema está depois da linha 35 na classe EntradaDados
Após carregar com dados o array pessoa[] quando retorno ao menu, esse array fica nulo…

Desculpe, mas sou novato, não entendo bem utilizar essa classe que sugeriu. Estou procurando conteúdo sobre isso. Obrigado. :roll:

Esse código em termos de orientação a objectos deixa muito a desejar.

Ainda assim o teu problema é que tu tens dois objectos Controle e não apenas um. E estás a escrever num e a ler de outro. Se queres usar o mesmo objecto só podes fazer um new e passar esse objecto para onde precisas de escrever / ler.

[quote=pmlm]Esse código em termos de orientação a objectos deixa muito a desejar.

Ainda assim o teu problema é que tu tens dois objectos Controle e não apenas um. E estás a escrever num e a ler de outro. Se queres usar o mesmo objecto só podes fazer um new e passar esse objecto para onde precisas de escrever / ler.[/quote]

Ah! Agora sim, vou tentar arrumar essa questão, certamente resolve. Quanto a questão OO sei que deve ter coisas mal feitas. Mas, é como dizemos, “vivendo e aprendendo”.

Agradeço a dica, amigo. :wink: