Construtores

Abri um topico no forum para que me ajudasse em um programa de cadastro com array e consegui faze-lo. Fui tentar implementar o mesmo com construtores e o programa compila mas na hora da busca e listagem, não funciona

primeira parte (metodos)

import java.util.Scanner;
import java.util.ArrayList;
public class Aluno
{
	int matricula;
	int mat2;
	String nome;
	String data;
	String end;
	String email;
	int i;

public Aluno (int matricula,String nome,String data,String end, String email)
	{

			this.matricula = matricula;
			this.nome = nome;
			this.data = data;
			this.end = end;
			this.email = email;
	}

 public void Busca (Aluno aluno[], int mat2)
 {
			for (i = 0; i <50; i++)
			{
				if(mat2 == aluno[i].matricula)
				{
					System.out.println ("Matricula " +aluno[i].matricula);
					System.out.println ("Nome " +aluno[i].nome);
					System.out.println ("Data de nascimento " +aluno[i].data);
					System.out.println ("Endereço " +aluno[i].end);
					System.out.println ("Email " +aluno[i].email);
					System.out.print("\n\n");
					break;
				}
				else {
					System.out.print("\n\n");
					System.out.println("Aluno nao cadastrado \n");
					System.out.print("\n\n");
					break;
				}
		}
 }
}

segunda parte (main)

[code]
import java.util.Scanner;
import java.util.ArrayList;
public class Cadastro
{
public static void main (String args[])
{
Scanner input = new Scanner (System.in);
Aluno[] aluno = new Aluno[50]; //Variavel do tipo da classe do outro programa
int op;
int i = 0;
int mat2;
int matricula;

			String nome;
			String data;
			String end;
String email;
		Aluno al;
		do
		{
		   System.out.print ("1-Criar cadastro\n2-Procurar matricula\n3-Listar\n0-Sair");
		   System.out.print("\n\n");
		   op = Integer.parseInt (input.nextLine ());
		   System.out.print("\n");

		   switch (op)
		               {
			             case 1: 	if (i >=50) // CADASTRO
			                                  {
												     System.out.print ("Capacidade esgotada \n");
												     break;
			                                  }
			                        else {
												  //   aluno [i] = new Aluno(); // cada laço, cria um novo Aluno
												    // Scanner input = new Scanner (System.in);
													 		    System.out.print ("Digite sua matricula \n\n");  //MATRICULA
													 			matricula = Integer.parseInt (input.nextLine ());
													 			System.out.print("\n");
													 			System.out.println("Digite o seu nome \n\n"); // NOME
													 			nome = input.nextLine();
													 			System.out.print("\n");
													 			System.out.print ("Digite a data de nascimento \n\n"); //DATA
													 			data = input.nextLine();
													 			System.out.print("\n");
													 			System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO
													 			end = input.nextLine();
													 			System.out.print("\n");
													 			System.out.println("Digite o seu email \n\n"); // EMAIL
													 			email = input.nextLine();
																System.out.print("\n");
			                                         i++;
			                                         break;
								         }
	                    case 2: // BUSCA
	                             System.out.print("Digite a matricula \n");
	                             mat2 = Integer.parseInt (input.nextLine ());
	                             System.out.print("\n\n");
	                             aluno[0].Busca(aluno,mat2); //PASSA O ALUNO 0 PARA O METODO E LA É REALIZADO O PERCORRIMENTO DO ALUNO
							     break;
					 case 3: // LISTAGEM
					 			for (i = 0; i < 50;i++)
										{
											if (aluno[i] != null)
											{
												System.out.println (aluno[i].matricula);
												System.out.println (aluno[i].nome);
												System.out.println (aluno[i].data);
												System.out.println (aluno[i].end);
												System.out.println (aluno[i].email);
												System.out.print("\n\n");
											}
										}
										break;
	                      }
	    }while (op !=0);
}

}[/code]

na hora da listagem ele não lista nada e na hora da busca ele da erro de pointer null

Olá novamente gustavo.rotondo,

O problema na verdade é que você não instanciou a classe Aluno, toda vez que dá Null Pointer, é falta de instancia de alguma classe…

Gustavo.rotondo, tente identificar e mostrar o ponto exato do seu problema assim terá mais chances de obter uma resposta mais precisa.

O problema é que você não está armazenando o cadastro do Aluno, por isso dá nullpointer.

Fiz umas modificações no programa

usei construtores, get sets

primeira parte (compila sem erros)

//Classe que simula cadastro de alunos de um curso universitário

import java.util.Scanner;
import java.util.ArrayList;

public class CadastroAlunos{
	//Atributos da classe
	private int Matricula;
	private String NomeAluno;
	private String DataNasc;
	private String Endereco;
	private String Email;

	//Metodo Construtor
	public CadastroAlunos (int matr, String nome, String data, String end, String emai){
		Matricula = matr;
		NomeAluno = nome;
		DataNasc = data;
		Endereco = end;
		Email = emai;
	}

	int pos=0;
	public int getMatricula()
	{
		return Matricula;
	}
	public void setMatricula (int Matricula)
	{
		this.Matricula = Matricula;
}
	public String getNomeAluno()
	{
		return NomeAluno;
	}
	public void setNome (String NomeAluno)
	{
		this.NomeAluno=NomeAluno;
	}
	public String getDataNasc()
		{
			return DataNasc;
		}
	public void setDataNasc (String DataNasc)
		{
			DataNasc=DataNasc;
	}
	public String getEndereco()
		{
			return Endereco;
		}
		public void setEndereco (String Endereco)
		{
			Endereco=Endereco;
	}
	public String getEmail()
		{
			return Email;
		}
		public void setEmail (String Email)
		{
			Email=Email;
	}

	public void Imprime(){

		System.out.printf("\nMatricula: %d\n", Matricula);
		System.out.printf("\tNome do Aluno: %s\n", NomeAluno);
		System.out.printf("\tData de nascimento: %s\n", DataNasc);
		System.out.printf("\tEndereco: %s\n", Endereco);
		System.out.printf("\tE-mail: %s\n", Email);
		System.out.print("\n\n");
	}
	}

segunda parte (onde tem erros)

import java.util.Scanner;
import java.util.ArrayList;
public class AplicativoCadastro
{
	public static void main (String []arg)
	{
		Scanner input = new Scanner(System.in);
		Scanner oper = new Scanner(System.in);
		CadastroAlunos Aluno[];  
		Aluno = new CadastroAlunos[50]; //
		int op;
		int i=0;
		int matp;
		int matricula;
		String NomeAluno;
		String DataNasc;
		String Endereco;
		String Email;

		do{
			System.out.print("\n\n###CADASTRO DOS ALUNOS###\n\n");
			System.out.print("\n1 - Cadastrar aluno \n2 - Listar todos os alunos cadastrados \n3 - Buscar aluno pela matricula \n4 - Sair do programa \nDigite sua opcao: ");
			op = Integer.parseInt(oper.nextLine());
			switch(op){
				case 1: if(i > 50){
							System.out.print("\nNao ha mais vagas para o curso - todas as 50 vagas foram preenchidas!\n");
						}
						else{
							Aluno aluno = new CadastroAlunos(); // ******ERRO AQUII *******
							CadastroAlunos al = new CadastroAlunos(); // ******ERRO AQUII *******

							i++;
							}
						break;
				case 2: System.out.print("\n\n###LISTA DOS ALUNOS###\n\n");
							for (i=0; i<50; i++){
								Aluno[i].Imprime();
							}
							break;
				case 3: System.out.print("\nInforme a matricula para consulta: \n");
						matp = Integer.parseInt(input.nextLine());
						int pos=0;
						for (pos=0; pos<50; pos++){
							if(matp == Aluno[pos].getMatricula()){
								Aluno[pos].Imprime();}
						}
						break;
				case 0: System.out.println("\nSaindo do programa\n");
						break;

			}
		}while(op!=0);
	}
}

coloquei mais ou menos como vi numa apostila. delclarar uma variavel do tipo aluno e instanciar. e como eu faria na segunda parte (MAIN) para colocar o nome, matricula etc?

Você criou um construtor:

CadastroAlunos (int matr, String nome, String data, String end, String emai)  

e está chamando outro…

CadastroAlunos ()

Quando você cria uma classe, se você não criar nenhum construtor, a JVM irá criar um construtor básico sem nenhum parâmetro automaticamente. Você poderá chamar

class SemConstrutor{}

class Teste{

     public static void main(String args[]){
          SemConstrutor sc = new SemConstrutor(); /*Criado automaticamente*/
     }
}

Mas se você criar qualquer construtor com qualquer quantidade de parâmetros, a JVM não vai criar nenhum construtor automático sem parâmetros.
Aí neste caso, a sua chamada a

Aluno aluno = new CadastroAlunos();

por exemplo, não funcionará

Crie um construtor vazio.

//Metodo Construtor public CadastroAlunos (){ /*Matricula = matr; NomeAluno = nome; DataNasc = data; Endereco = end; Email = emai;*/ }

Assim?

ai para cadastrar ficaria como?

System.out.print ("Digite sua matricula \n\n"); //MATRICULA matricula = Integer.parseInt (input.nextLine ());

não sei como usar o get, set nesse caso e teria que criar um new aluno?

gustavo.rotondo, de uma olhada no outro post que você criou, lá existe um metodo

Man, o esquema é simples, mas, é assim que começa, só aprende quebrando a cabeça e com muita pesquisa.

tem alguns artigos que acho legal você ler:

http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/

http://fabriciovallim.wordpress.com/2011/05/05/o-que-e-encapsulamento/

http://blog.caelum.com.br/revisitando-a-orientacao-a-objetos-encapsulamento-no-java

Aos poucos ta saindo haha

então, crie os get’s sets tudo direito e fiz um metodo para o cadastro

public void Cadastro(int Matricula, String NomeAluno, String DataNasc, String Endereco, String Email) { this.Matricula=Matricula; this.NomeAluno=NomeAluno; this.DataNasc=DataNasc; this.Endereco=Endereco; this.Email=Email; }

é certo isso? ou com get set não precisa? não achei isso na minha apostil

ai no main ficou isso o cadastro

[code]switch(op){
case 1: if(i > 50){
System.out.print("\nNao ha mais vagas para o curso - todas as 50 vagas foram preenchidas!\n");
}
else{
for (i = 0; i<50; i++)
{
Aluno[i] = new CadastroAlunos();
System.out.print (“Digite sua matricula \n\n”); //MATRICULA
Matricula = Integer.parseInt (input.nextLine ());
System.out.print("\n");
System.out.println(“Digite o seu nome \n\n”); // NOME
NomeAluno = input.nextLine();
System.out.print("\n");
System.out.print (“Digite a data de nascimento \n\n”); //DATA
DataNasc = input.nextLine();
System.out.print("\n");
System.out.println(“Digite o seu endereço \n\n”); // ENDEREÇO
Endereco = input.nextLine();
System.out.print("\n");
System.out.println(“Digite o seu email \n\n”); // EMAIL
Email = input.nextLine();
System.out.print("\n");
Aluno[i].Cadastro (Matricula,NomeAluno,DataNasc,Endereco,Email);

						            i++;
						            break;

						}

					}

[/code]

ele compila certo, consigo cadastra, mas quando termina o email, ele imprime os dados e da erro de pointer null

pela minha logica, a cada laço, eu cri um aluno e passo ele pro metodo de cadastro. em C seria mais ou menos isso

Man, vc está indo no caminho certo, eu removeria esse construtor e criaria um vazio.

Vc vai precisar de um List para guardar as referências de seus objetos e dar um new no objeto sempre que entrar no switch e jogar dentro de seu List, essa é a única forma de recuperar os registros e exibir no console.

Tente seguir as boas práticas e criar variáveis com letra minúscula.

  • ou - assim:
			switch (op) {
			case 1:
				if (qtdeCadastros >= 50) // CADASTRO
				{
					System.out.print("Capacidade esgotada \n");
					break;
				} else {
					Aluno aluno = new Aluno();
					System.out.print("Digite sua matricula \n\n"); // MATRICULA
					matricula = Integer.parseInt(input.nextLine());
					System.out.print("\n");
					System.out.println("Digite o seu nome \n\n"); // NOME
					nome = input.nextLine();
					System.out.print("\n");
					System.out.print("Digite a data de nascimento \n\n"); // DATA
					data = input.nextLine();
					System.out.print("\n");
					System.out.println("Digite o seu endereço \n\n"); // ENDEREÇO
					end = input.nextLine();
					System.out.print("\n");
					System.out.println("Digite o seu email \n\n"); // EMAIL
					email = input.nextLine();
					System.out.print("\n");
					qtdeCadastros++;
					aluno.setMatricula(matricula);
					aluno.setNome(nome);
					aluno.setData(data);
					aluno.setEnd(end);
					aluno.setEmail(email);
					alunos.add(aluno);
					break;
				}

esse add aluno, tenho que criar um metodo add ou é tipo set get?
e esse list ai eu nunca vi sobre

é um metodo para guardar os “alunos”?

[quote=gustavo.rotondo]esse add aluno, tenho que criar um metodo add ou é tipo set get?
e esse list ai eu nunca vi sobre

é um metodo para guardar os “alunos”?[/quote]

Não é do get e set, esse add é da lista, deve ficar embaixo do seu Scanner input.

List alunos = new ArrayList();

Vc precisa criar um:

List alunos = new ArrayList();