Problema com preenchimento de array via classe Main

9 respostas
J

Galera... To com o seguinte problema:

Tenho uma classe Main e outra Professor. Na main tenho um switch dentro do método main e através dele chamo outros métodos da classe Main. Mas a cada vez que faço um cadastro novo de professor o array que está na classe professor fica só com esse último professor, repetindo ele. Tipo assim:

Cadastro 1: Joao
impressão:
nome: Joao

Cadastro 2: Jose
impressão:
nome: Jose
nome: Jose

Cadastro 3: Mateus
impressão:
nome: Mateus
nome: Mateus
nome: Mateus

Aí vai o código:

public class Professor extends Academico {
        
    Vector professores = new Vector();
.
.
.
    
    public void cadastrarProfessor(EstruturaProfessor dados)
    {           
        System.out.println("ENTROU");
        professores.addElement(dados);
                    
        System.out.println(this); //Imprime os dados do professor corrente 
        imprimir();
    }    
   
    
    public void imprimir()
    {            
        for (int k = 0 ; k < professores.size(); k++)
        {
            EstruturaProfessor obj = (EstruturaProfessor)professores.get(k);
            System.out.printf("IMPRIMIR--> Nome: %s\n", obj.nome);
        }
    }
} //fim classe Professor



public class CursoTeste { 
        
    public static void main(String[] args) {
        
        Scanner leOpcao = new Scanner(System.in);
        int opcao = 1; 
        CursoTeste ct = new CursoTeste();
                
                
        while (opcao != 0)
        {            
            System.out.println("1. Cadastrar Professor");                        
            System.out.println("0. Sair");          
            
            System.out.println("Digite a opcao desejada: ");    
            opcao = leOpcao.nextInt();
            
            switch (opcao)
            {
                case 1:                    
                    ct.cadastraProf();                 
                    break;
            }
        }
    }//fim método main


    EstruturaProfessor ep = new EstruturaProfessor();
    Professor objProf = new Professor(" ", 0 , " ", " ", " ");     
    String nomeExcluir;
    
       
    // Método cadastra professor - CASE 1
    public void cadastraProf()
    {                           
        Scanner scanProf = new Scanner(System.in);               
        
        System.out.println("Digite o nome do professor: ");
        objProf.setNome(scanProf.nextLine());         
        ep.nome = objProf.getNome();

        System.out.println("Digite o registro universitário do professor: ");     
        objProf.setRU(scanProf.nextLine());
        ep.ru = objProf.getRU();

        objProf.cadastrarProfessor(ep);
    }// fim método cadastraProf

} //fim classe CursoTeste

BOM, SE ALGUÉM PUDER ME AJUDAR, TÁ FEIO O NEGÓCIO AQUI.... JÁ TENTEI DE TUDO E TENHO CERTEZA QUE É BOBEIRA...

VALEUUUUUUU

9 Respostas

T

Hum, você não declarou alguma coisa como “static” sem precisar?
Não estou dizendo no código que você postou, mas no resto do seu código, que você não postou :stuck_out_tongue:

J

Não, antes eu até tava colocando static, mas fica dentro do método main a chamada dos métodos não static como tá alí:

CursoTeste ct = new CursoTeste(); 

switch (opcao)  
{  
         case 1:                      
         ct.cadastraProf();                   
         break;  
}

Tb pensei que fosse o problema do static, mas não resolveu :-(

T

Cada vez que você cadastra um novo professor, é necessário criar um novo objeto Professor.
Como você só criou um objeto, o mesmo professor será cadastrado N vezes ao ser adicionado à lista.
Acho que é só isso.
Onde é que você cria um novo objeto Professor é que vou deixar para você quebrar um pouco a cabeça.

J

Thingol,

Eu coloquei a instanciação do objeto objProf dentro do próprio método cadastraProf() e agora parece que toda vez que cadastro um novo professor fica somente ele no vetor professores. :frowning:

Não sei se fiz certo…

FilhoDoRei

Você poderia utilizar o ArrayList no lugar de Vector, garanto que fazendo isso ja ajuda muito,

Mas antes faça o que o Thingol falou,

Depois vc pode tentar imprimir os objetos do ArrayList utilizando o enhaced for.

falows

J

Mas num é esse o problema não… Eu já tentei com ArrayList, com Array normal e agora com Vector… Com os 3 dá o mesmo problema…

miguel.horlle

Cara,

Ao que parece no primeiro momento você está utilizando sempre o mesmo professor (instancia), com isso você sempre alterava os atributos da mesma instancia, então no array aparecia sempre o ultimo que vc cadastrou (que na verdade é a mesma instancia de sempre).

Depois você tentou instanciar um novo professor para cada cadastro (que é o correto), porém com esta modelagem atual isto não é permitido. Isso acontece porque cada entidade professor carrega seu proprio array de professores, por isso toda vez que você cria uma nova instancia e adiciona ela mesma para o array você está perdendo o array anterior, que estava na instancia anterior.

Para resolver este problema voce precisa colocar o array de professores fora da classe Professor, com isso voce pode instanciar quantos professores quiser e adicionar neste array, e eles estarão lá. Sugiro que este array fique na classe CursoTeste.

Faça o teste.

Espero ter ajudado, se eu não fui claro é só falar.

Sorte

J

Galera,

Valeu mesmo pelo tempo disponibilizado com minha dúvida…

Miguel, é isso mesmo… Criei direto na classe CursoTeste e deu certo… É que eu queria deixar na classe Professor toda a parte de implementação, por isso pensei daquele jeito…

Brigadão!!!

B

Vamos por partes com um pouco de Orientação à Objeto:

A classe Professor representa somente 1 professor, não todos.
public class Professor
{
    // Digamos que professor tenha somente nome e data de aniversario.
    private String nome;
    private String aniversario;

    // Construtor da classe, somente aqui definimos os seus dados.
    public Professor(String nome, String aniversario)
    {
        this.nome = nome;
        this.aniversario = aniversario;
    }

    public String toString()
    {
        return "Professor " + nome + " - Nasc.: " + aniversario;
    }
}
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Curso
{

    // Aqui declaramos uma lista de professores cadastrados
    // Assim ele terá um escopo para toda a vida deste objeto
    private static List<Professor> professores;

    // Usamos o mesmo Scanner para todo o objeto:
    private static Scanner in;

    // Ambos são static por que só atributos static
    // podem ser usados por métodos static
    // este é um bloco static, tudo aqui será executado
    // quando esta classe for criada
    public static void main(String[] args)
    {
        // Aqui criamos a lista fisicamente.
        professores = new ArrayList<Professor>();

        // E instanciamos o leitor
        in = new Scanner(System.in);

        int opcao = 1;

        while (opcao != 0)
        {
            System.out.println("1. Cadastrar Professor");
            System.out.println("2. Listar Professores");
            System.out.println("0. Sair");

            System.out.println("Digite a opcao desejada: ");

            // Usamos o Leitor aqui
            // Lembre-se, in é static para poder ser usado de fora deste método
            opcao = in.nextInt();

            // um pequeno hack pra ele pegar os dados certos
            in.nextLine();

            switch (opcao)
            {
                case 1:
                    // cadastraProf também é static pelo mesmo motivo.
                    cadastraProf();
                    break;
                case 2:
                    // O proprio ArrayList tem seu método toString que 
                    // itera por todos os objetos chamando seus toStrings
                    // mais uma formatação especial.
                    System.out.println(professores);
                    break;
            }
        }
    }

    public static void cadastraProf()
    {
        System.out.println("Digite o nome do professor: ");

        // Pegamos o nome e colocamos numa variavel local.

        // Usamos o mesmo Leitor novamente aqui
        // já que o escopo dele é para todo o objeto, podemos usar
        // em qualquer lugar neste objeto. Simples né?
        String nome = in.nextLine();

        System.out.println("Digite a data de aniversário do professor: ");

        // O mesmo com seu aniversario
        // e por último o mesmo leitor novamente.
        String aniv = in.nextLine();

        // Agora vamos por partes.
        // Declaramos o professor
        Professor prof;

        // Instanciamos o professor usando new.
        // Sempre um novo objeto usa new (MUITO IMPORTANTE).
        // Ao mesmo tempo passamos seus dados para o construtor.
        prof = new Professor(nome, aniv);

        // por fim colocamos o professor na lista de professores:
        professores.add(prof);

        // E pronto, professor cadastrado!

        // Por último fazemos o extra de imprimir o professor que 
        // acabamos de colocar

        // Mas como, o professor não está dentro da lista?
        // Sim, mas a referencia para ele continua a existir neste escopo
        // prof é uma variável local para este método.

        // E segundo, como ele imprimiu? Não chamei nada!
        // o método toString é executado automaticamente
        // para converter para o tipo necessário que println
        // recebe, uma String

        System.out.println(prof);
    }
}
Criado 30 de maio de 2008
Ultima resposta 30 de mai. de 2008
Respostas 9
Participantes 5