Erro em construtor e entrada de dados.

Java

11/04/2022

Estou fazendo um código, estudando, para entrar com dados porém há erros quando executo e não sei o motivo do compilador pedir um construtor vazio se já existe um montado com os parâmetros. Getters e setters estão na classe Aluno, os métodos na classe Disciplina, tudo dentro do mesmo pacote. Obrigado.
package pck;

import java.util.Scanner;
import pck.Disciplina;
import pck.Aluno;

public class main {

	public static void main(String[] args) {
		Disciplina disciplina = new Disciplina();
		 //Aluno aluno = new Aluno();
		//Aluno a1 = new Aluno("Ricardo", 31, 1);
		//Aluno a1 = null;
		//Aluno a2 = new Aluno("Ana Elisa", 17, 1);
		//Aluno a3 = new Aluno("Geovana", 18, 2);
		//Aluno a4 = new Aluno("Livia", 20, 2);
		Scanner sc = new Scanner(System.in);
		
	System.out.println("Enter com a quantidade de alunos: ");
	int a = sc.nextInt(); 	
	Aluno[] alunos = new Aluno[a];
		
		for (a = 0;a < alunos.length;a++) {		
			Aluno aluno = new Aluno();// o construtor está na classe Aluno, como pode estar indefinido? Pedindo construtor vazio porque?
			System.out.println("Entre com o nome, a idade e a disciplina: ");
			String nome = sc.nextLine();
			int idade = sc.nextInt();//erro na entrada de dados. mismach.
			int turma = sc.nextInt();
			String NomeDisciplina = sc.nextLine();			
			
			//disciplina.adicionarAluno(nome,idade,turma, nomeDisciplina);			
			disciplina.adicionarAluno(aluno);
		}		
		//disciplina.adicionarAluno(a2);
		//disciplina.adicionarAluno(a3);
		//disciplina.adicionarAluno(a4);
			
	System.out.println("Quantidade de alunos: " + disciplina.getNumAlunos());
	disciplina.exibirInformacoes();
		
	System.out.println("Antes de remover alunos. ");
		//removendo aluno
		//disciplina.removerAluno(a2);		
		
	System.out.println("Despois de remover alunos. ");
	disciplina.exibirInformacoes();
		
	System.out.println("Quantidade de alunos: " + disciplina.getNumAlunos() + "\n");
		
		System.exit(0);
	}

}

package pck;
import pck.Disciplina;

public class Aluno {
	private String nome;
	private String NomeDisciplina;
	private int idade, turma;	
	
	public Aluno(String nome, String nomeDisciplina, int idade, int turma) {		
		this.nome = nome;
		this.NomeDisciplina = nomeDisciplina;
		this.idade = idade;
		this.turma = turma;		
	}

	public Aluno() {
		
	}

	public void setNome(String nome) {// atribui um valor para o atributo nome.
		if(nome == null || nome.isEmpty() || nome.isBlank()){
            System.out.println("Valor deve ser preenchido");
            return;
		}
		this.nome = nome;
	}
	
	public String getNome() {
		if(nome == null || nome.isEmpty() || nome.isBlank()){
            System.out.println("Valor do nome não foi preenchido");
            return "";
            }
		return nome;
	}

	public String getNomeDisciplina() {//Disciplina
		return NomeDisciplina;
	}

	public void setNomeDisciplina(String NomeDisciplina) {//set de disciplina
		this.NomeDisciplina = NomeDisciplina;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public int getIdade() {
		return idade;
	}

	public void setTurma(int turma) {
		this.turma = turma;
	}

	public int getTurma() {
		return turma;
	}

	public String mostrarInformacoes() {
		return "Nome: " + getNome() + "\nIdade: " + getIdade() + "\nTurma: " + getTurma() + "\n" + "##############";
	}	
}

package pck;

public class Disciplina {
	private Aluno[] alunos;	
	private Disciplina[] disciplina = new Disciplina[10];
	private int posicao;	
		
	public Disciplina() {
		this.alunos = new Aluno[40];//construtor, quando cria a disciplina, cria automaticamente um vetor Aluno de 40 posições.
		 //Disciplina disciplina = new Disciplina();
	}
	
	public int getNumAlunos() {
		int cont = 0;
		for (int i = 0; i < alunos.length; i++) {
			if(alunos[i] != null) {//se a posição é diferente de null não conta.
				cont++;
			}
		}
		return cont;//retorna o número de alunos.
	}
	
/*	public void adicionarAluno(Aluno aluno) {
		if(alunos != null){		        
			this.alunos[posicao] = aluno;
			posicao = posicao + 1;
				//return true;
			} else {
				System.out.println("Valor deve ser preenchido");
				//return false;//aluno não foi adicionado.
		}
	} */
	
	public boolean adicionarAluno(Aluno aluno) {		
			if(alunos != null){		        
				this.alunos[posicao] = aluno;
				posicao = posicao + 1;
					return true;
				} else {
					System.out.println("Valor deve ser preenchido");
					return false;//aluno não foi adicionado.
			}
	}
	
	public boolean removerAluno(Aluno aluno) {//verifica sem existe nome, idade, e turma, as três tem de ser verificadas, pois podem haver repetições.
		for(int i = 0; i < alunos.length; i++) {//para remover o aluno do vetor. Excluindo pelo nome, idade e turma.
			if((alunos[i].getNome() == aluno.getNome()) &&
			   		(alunos[i].getIdade() == aluno.getIdade()) && 
			   			(alunos[i].getTurma() == aluno.getTurma()) &&
			   			(alunos[i].getNomeDisciplina() == aluno.getNomeDisciplina())) {
							alunos[i] = null;//remove um aluno
								return true;				
									} //aqui não podemos, após esta chave, por causa da posição do vetor, por exemplo, aluno na posição 3.
			//por causa da iteração, o for não estará na posição 0. Pode estar em outra posição. Ele pode não estar na posição 0 e retorna false,
			//queremos que percorra todo o vetor e não encontrar a condição do if acima.
		}
		return false;//caso não encontre na primeira posição, pode estar em outra posição de 0 a 4. Tem de percorrer todo o vetor e não cair dentro do if.
		//por isso não tem o else e o return está fora da condição. False é porque não está no vetor.
	}	
	
	//exibir as informações de todos os alunos.
	public void exibirInformacoes() {
		for (int i = 0; i < alunos.length;i++) {
			if (alunos[i] != null)//if para evitar exceção se a posição for null pela informação removida, pois a posição não tem mais dados, está vazia.
			System.out.println(alunos[i].mostrarInformacoes());//chama o método já pronto mostrarInformações que está na classe Aluno. Mostra somente posições com valores.
			
		}
	}
}
Paulo

Paulo

Curtidas 0

Respostas

Augustomesquita

Augustomesquita

11/04/2022

Não entendi... qual exatamente é o erro? Existem diversas classes no código postado. Poderia colar a mensagem de erro aqui?
GOSTEI 0
Augustomesquita

Augustomesquita

11/04/2022

Bom, tentando responder com as informações disponíveis, se o problema for que o compilador está reclamando que precisa de um construtor vazio em Aluno na linha 24:
Aluno aluno = new Aluno();


Ele está agindo da forma como deveria, pois você está instânciando um objeto Aluno sem parâmetros. Para ele não reclamar, você teria que construir o objeto Aluno utilizando o construtor com parâmetros que você definiu. Exemplo:
Aluno aluno = new Aluno("Augusto", "Estrutura de Dados", 30, 1);
GOSTEI 0
Augustomesquita

Augustomesquita

11/04/2022

Bom, tentando responder com as informações disponíveis, se o problema for que o compilador está reclamando que precisa de um construtor vazio em Aluno na linha 24:
Aluno aluno = new Aluno();

Ele está agindo da forma como deveria, pois você está instânciando um objeto Aluno sem parâmetros. Para ele não reclamar, você teria que construir o objeto Aluno utilizando o construtor com parâmetros que você definiu. Exemplo:
Aluno aluno = new Aluno("Augusto", "Estrutura de Dados", 30, 1);
GOSTEI 0
Paulo

Paulo

11/04/2022

Isso corrigi, obrigado pela resposta, porém quando tento entrar com a idade ele apresenta erro como estivesse ultrapassando o tamanho do vetor. O vetor está delcarado na classe Disciplina com 40 posições.
public Aluno(String nome, String NomeDisciplina, int idade, int turma) {		
		this.nome = nome;
		this.NomeDisciplina = NomeDisciplina;
		this.idade = idade;
		this.turma = turma;		
	}	

O construtor está na classe Aluno, porém o erro na entrada do inteiro idade continua. O resto eu vou verificar para conxertar, obrigado.
GOSTEI 0
POSTAR