Sou iniciante na programação com JAVA e criei um sistema acadêmico para a aula, usando as classes Aluno e Professores, tendo que cadastrar, pesquisar, etc.
Não estou conseguindo fazer com que os dados que o usuário digita quando cadastra vá para o vetor, pois quando vou pesquisar, salva apenas o ultimo cadastro, jogando fora os anteriores. Segue meu código.
Método principal:
package sistemaacademico2;
import java.util.Scanner;
public class Sistemaacademico2
{
Aluno objAluno = new Aluno();
Professor objProfessor = new Professor();
static private Aluno alunos[] = new Aluno[10];
static private Professor professores[] = new Professor[10];
static Scanner entrada = new Scanner(System.in);
public void cadastrarAluno(Aluno[] alunos)
{
System.out.println("CADASTRO DE ALUNO");
System.out.println("Insira o nome:");
objAluno.setNome(entrada.nextLine());
objAluno.setNome(entrada.nextLine());
System.out.println("Insira o RA:");
objAluno.setRA(entrada.nextInt());
System.out.println("Digite o curso:");
objAluno.setCurso(entrada.nextLine());
objAluno.setCurso(entrada.nextLine());
System.out.println("Informe o endereço:");
objAluno.setEndereco(entrada.nextLine());
System.out.println("Selecione o sexo:");
objAluno.setSexo(entrada.nextLine());
System.out.println("Digite o telefone:");
objAluno.setTelefone(entrada.nextLine());
}
public void pesquisarAluno(Aluno[] alunos)
{
int ra;
System.out.println("Digite o RA do aluno:");
ra= entrada.nextInt();
for (int i=0; i<alunos.length; i++)
{
if(objAluno.getRA()== ra)
{
System.out.println("ALUNO CADASTRADO");
System.out.println(objAluno.getNome());
System.out.println(objAluno.getCurso());
System.out.println(objAluno.getEndereco());
System.out.println(objAluno.getSexo());
System.out.println(objAluno.getTelefone());
}
}
}
public static void main(String[] args)
{
Sistemaacademico2 sa = new Sistemaacademico2();
int menu;
do{
System.out.println("SISTEMA ACADEMICO");
System.out.println("Digite a opção que deseja:");
System.out.println("0 - SAIR");
System.out.println("1 - CADASTRAR ALUNO ");
System.out.println("2 - EXCLUIR ALUNO ");
System.out.println("3 - PESQUISAR ALUNO");
menu = entrada.nextInt();
switch(menu)
{
case 0:
System.exit(0);
break;
case 1:
sa.cadastrarAluno(alunos);
break;
case 2:
break;
case 3: sa.pesquisarAluno(alunos);
break;
default: System.out.println("Opção invalida");
break;
}
}while(menu!=0);
}
}
CLASSE ALUNO:
public class Aluno
{
private String nome;
private int RA;
private String sexo;
private String endereco;
private String telefone;
private String curso;
public void setNome(String nome)
{
this.nome=nome;
}
public String getNome()
{
return nome;
}
public void setSexo(String sexo)
{
this.sexo=sexo;
}
public String getSexo()
{
return sexo;
}
public void setEndereco(String endereco)
{
this.endereco=endereco;
}
public String getEndereco()
{
return endereco;
}
public void setRA(int RA)
{
this.RA=RA;
}
public int getRA()
{
return RA;
}
public void setCurso(String curso)
{
this.curso=curso;
}
public String getCurso()
{
return curso;
}
public void setTelefone(String telefone)
{
this.telefone=telefone;
}
public String getTelefone()
{
return telefone;
}
}
Conseguindo arrumar a parte dos alunos, a do professor será a mesma coisa.
Está havendo uma confusão de conceitos ai… se seu sistema academico cria a quantidade de alunos e professores, você não precisa passar o vetor para os métodos cadastrarAluno e pesquisarAluno etc… podemos melhorar suas classes assim…
public class SistemaAcademico2 {
private Aluno[] alunos;
private Professor[] professores;
private int contAlunos;
private int contProfessores;
private Scanner entrada;
public SistemaAcademico2(int qtdAlunos, int qtdProfessores) {
this.alunos = new Aluno[qtdAlunos];
thits.professores = new Professor[qtdProfessores];
this.entrada = new Scanner(System.in);
}
public void cadastrarAluno() {
if (this.contAlunos == this.alunos.length) {
throw new Exception("Limite de cadastros atingidos!");
}
Aluno novoAluno = new Aluno();
...
this.alunos[contAlunos++] = novoAluno;
}
}
O mesmo vale para os métodos de professor ok?
E no main…
SistemaAcademico2 sa = new SistemaAcademico2(10, 10);
...
case 1:
sa.cadastrarAluno();
...
E assim por diante…
Perceba que deixei os nomes um pouco diferentes como SistemaAcademico2, mudei as chaves de lugar… isso é um padrão de convenção altamente recomendável, aproveite que está estudando para praticar esse padrão e ficar familiarizado…
Outro conceito aplicado no seu código é que sua classe SistemaAcademico encapsulou a regra de criar um cadastro de aluno ou professor, etc…
E por fim, perceba que adicionei alguns contadores (contAlunos e contProfessores), esses caras servem para validação como fiz no if que solta uma exceção caso o limite de cadastro tenha sido atingido… vai imaginando que ao remover um cadastro do vetor, você precisa diminuir esses contadores em 1 ou seja…
contAlunos--
Em algum lugar do seu código…
Recomendo essa apostila, fala bastante sobre manipulação de vetores…
Muito obrigado pela apostila, irei dar uma lida neste feriado. Em relação ao codigo, tentei implementar com suas mudanças,cadastrei 2 alunos porem quando vou pesquisar pelo ra ele não aparece nada, nenhum dos 2, será que é pela forma que instanciei o objeto no metodo de pesquisar?
A classe de cadastro ficou assim:
. . .
Aluno novoAluno = new Aluno();
System.out.println("CADASTRO DE ALUNO");
System.out.println("Insira o nome:");
novoAluno.setNome(entrada.nextLine());
System.out.println("Insira o RA:");
novoAluno.setRA(entrada.nextInt());
. . .
e a classe de pesquisar tentei fazer assim, pois desse seu jeito tive que instanciar um objeto nesse método:
public void pesquisarAluno()
{
int ra;
Aluno novoAluno = new Aluno();
System.out.println("Digite o RA do aluno:");
ra= entrada.nextInt();
for (int i=0; i<alunos.length; i++)
{
if(novoAluno.getRA()== ra)
{
System.out.println("ALUNO CADASTRADO");
System.out.println(novoAluno.getNome());
System.out.println(novoAluno.getCurso());
System.out.println(novoAluno.getEndereco());
System.out.println(novoAluno.getSexo());
System.out.println(novoAluno.getTelefone());
}
}
}
Você ja tem um vetor preenchido, logo não precisa de um new Aluno no método pesquisar…
public void pesquisarAluno()
{
int ra;
System.out.println("Digite o RA do aluno:");
ra= entrada.nextInt();
for (Aluno aluno : this.alunos)
{
if(aluno.getRA()== ra)
{
System.out.println("ALUNO CADASTRADO");
System.out.println(aluno.getNome());
System.out.println(aluno.getCurso());
System.out.println(aluno.getEndereco());
System.out.println(aluno.getSexo());
System.out.println(aluno.getTelefone());
}
}
}
Um novo aluno deve ser criado (new) apenas no cadastro certo?
Faz sentido eu pesquisar um novo Aluno no vetor?
Tá pegando “os macete mano”, “se liga na fita truta” 
Bons estudos
Poxa, é mesmo, as vezes eu confundo essa logica, estou iniciando esse semestre com a programação orientada a objeto e as vezes tento fazer coisas ridiculas. Muito obrigado, fazendo esse sistema juntando com sua ajuda nesse fórum, melhoraram minhas ideias sobre java, muito obrigado. Só para encerrar o post, quando pesquiso o ra, ele puxa os dados porem encerra o programa, acusando o erro ’ Exception in thread “main” java.lang.NullPointerException ’ , na linha do if no método pesquisar e na chamada do método no main. Ja tinha visto que esse erro se trata dos índices dos vetores, como se nao tivesse sido inicializado, mas não entendi muito bem. Como poderia resolver essa questão? E tu poderia me falar sobre aquelas condições no laço for (Aluno aluno : this.alunos), pois é a primeira vez que me deparo com ela, agradeceria se pudesse me ajudar. Grato
Sugiro essa outra apostila, aliás, comece por ela, depois estude a de estrutura de dados…
Na verdade o NullPointerException trata de instância de objetos, quem trata de índice de vetores é o ArrayIndexOfBoundException…, enfim, se você quiser pesquisar antes de inserir um aluno no vetor, obviamente vai ter problemas, pois essa linha…
this.alunos = new Aluno[qtdAlunos];
Apenas diz que você criou n “cadeiras” para os alunos e não que n alunos já estão ocupando entende?
Depois dessa linha o vetor está com n cadeiras vazias (null) por isso lá no método cadastrarAluno existe…
Aluno novoAluno = new Aluno(); // ocupante da "cadeira"
...
this.alunos[contAlunos++] = novoAluno; // ocupou...
contAlunos vale zero no começo (apesar dele não sofrer mudanças no começo, pode ter certeza ele vale zero), quando se usa contAlunos++ ele conta + 1, mas nesse caso ele ainda alimenta a “cadeira” (indice do vetor) antes de mudar seu proprio valor… enfim a apostila fala mais a respeito…
Agora quanto ao for esquisito, ele tem um nome e se chama for each, a apostila fala a respeito também, mas ele faz um “resumo” de código e na hora que você for compilar o código, coisas estranhas acontecem e ele volta a ser um for tradicional… é apenas um jeito mais fácil de declarar um for…