Problema com construtor e método de inserção

deathcon4

Member
Registrado
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;

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 != 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.getNome() == aluno.getNome()) &&
(alunos.getIdade() == aluno.getIdade()) &&
(alunos.getTurma() == aluno.getTurma()) &&
(alunos.getNomeDisciplina() == aluno.getNomeDisciplina())) {
alunos = 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 != 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.mostrarInformacoes());//chama o método já pronto mostrarInformações que está na classe Aluno. Mostra somente posições com valores.

}
}

}
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" + "##############";
}

}
Boa tarde a todos. Estou construindo este código, e os getters, setters e construtores estão montados e corretos, porém na hora de entrar os dados, apresenta erro de mismatch. E pede para colocar um construtor vazio se já existe um com todos os parâmetros. Obrigado.
 
O problema está na forma que você usa o scan pra ler o input.

Cada vez que você chama o .nextLine ele não vai ler a linha e sim pular pra próxima.

Então, pra funcionar teria que ser algo como:

Java:
System.out.println("Enter com a quantidade de alunos: ");
int a = sc.nextInt();
sc.nextLine();
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.next();
    int idade = sc.nextInt();//erro na entrada de dados. mismach.
    int turma = sc.nextInt();
    String NomeDisciplina = sc.next();

    //disciplina.adicionarAluno(nome,idade,turma, nomeDisciplina);
    disciplina.adicionarAluno(aluno);
    sc.nextLine();
}

PS: A tag CODE existe pra gente usar, gente. :D
 
Obrigado, tem razão para não ler a próxima linha, pois ainda tem sujeira na memória. Esqueci. Testei, estes problemas foram resolvidos porém a variável idade dá erro:Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at pck.main.main(main.java:28)
Obrigado.
 
Obrigado, tem razão para não ler a próxima linha, pois ainda tem sujeira na memória. Esqueci. Testei, estes problemas foram resolvidos porém a variável idade dá erro:Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at pck.main.main(main.java:28)
Obrigado.
Como você tá inserindo os inputs? Um input e um enter? Porque eu testei esse código aqui e funcionou.
 

Users who are viewing this thread

Voltar
Topo