Eae pessoal. Bom, preciso fazer um programa aqui mas logo de cara me deparei com uma dúvida. Eu preciso receber do teclado o numero de alunos que uma turma terá. Aluno é um objeto no caso. Como instanciar N objetos de aluno?
Só pra entender a estrutura do meu código :
Classes: Aluno, Nota, Principal, Turma. O objetivo do código é armazenar pra cada aluno uma nota gerada aleatoriamente(Random) e depois apresentar. Porém o numero de alunos em cada turma sera recebido pelo teclado.
N objetos
38 Respostas
Eae pessoal. Bom, preciso fazer um programa aqui mas logo de cara me deparei com uma dúvida. Eu preciso receber do teclado o numero de alunos que uma turma terá. Aluno é um objeto no caso. Como instanciar N objetos de aluno?
Só pra entender a estrutura do meu código :
Classes: Aluno, Nota, Principal, Turma. O objetivo do código é armazenar pra cada aluno uma nota gerada aleatoriamente(Random) e depois apresentar. Porém o numero de alunos em cada turma sera recebido pelo teclado.
Olá!
Pelo que entendi vc tá aprendendo java agora. Correto? Então provavelmente vc está aprendendo arrays.
nesse caso vc está com dúvidas em como pegar o valor do teclado ou como instanciar o array?
pra pegar a quantidade:
String resp = JOptionPane.showInputDialog(null,inglmsg);
pra converter o resultado de string para inteiro:
int qt = Integer.parseInt(resp );
trabalhando com arrays:
Obs: Como sinto que vc tá começando agora, pelo tipo do exercício, acredito que a intenção de seu professor seja que vc domine arrays e laços de repetição (do while, while, foreach e for).
Mas saiba que existem várias formas para se trabalhar com muitos objetos instanciados. Tais como vector, hashMap, LinkedHashMap…
Acho que nao seria nenhuma das duas coisas. Bom, se preciso de “n” alunos para a turma como que eu vou fazer isso? até pouco eu criava por exemplo 3 objetos aluno:
Aluno aluno1=new Aluno();
Aluno aluno2=new Aluno();
Aluno aluno3=new Aluno();
Mas nesse caso eu preciso de N alunos(pois vou receber do teclado o numero de alunos na classe).
tentei assim:
for(int i=0;;i++){
Aluno aluno[i]=new Aluno();
//e depois aqui receberia o nome do aluno pelo teclado
System.out.println("nome do aluno: ");
aluno[i].nome=scan.nextLine(); //imagine que ja importei e criei o objeto de Scanner, scan.
}
essa ideia é errada?
<blockquote><div class="quote-author">killerkill:</div>Acho que nao seria nenhuma das duas coisas. Bom, se preciso de “n” alunos para a turma como que eu vou fazer isso? até pouco eu criava por exemplo 3 objetos aluno:
Aluno aluno1=new Aluno();
Aluno aluno2=new Aluno();
Aluno aluno3=new Aluno();
Mas nesse caso eu preciso de N alunos(pois vou receber do teclado o numero de alunos na classe).
tentei assim:
for(int i=0;;i++){
Aluno aluno[i]=new Aluno();
//e depois aqui receberia o nome do aluno pelo teclado
System.out.println("nome do aluno: ");
aluno[i].nome=scan.nextLine(); //imagine que ja importei e criei o objeto de Scanner, scan.
}
essa ideia é errada?
Sim, esse é o caminho. Mas como vc precisa receber do teclado o limite, esse é o limite de i.
Antes de entrar no laço, recebe quantidade limite e cria sua condicional.
Instanciar seu array fora do laço for e para cada posição dele instancie um novo aluno.
limiteString = recebedoteclado();
limite = convertToInteiro(limitestring);
// instancie seu array aqui
Aluno aluno[] = new Aluno[limite];
for(int i=0;[b]i<limite[/b];i++)
{
aluno[i]=new Aluno();
//e depois aqui receberia o nome do aluno pelo teclado
System.out.println("nome do aluno: ");
aluno[i].nome=scan.nextLine(); //imagine que ja importei e criei o objeto de Scanner, scan.
}
isso isso isso.
eu nao sabia como fazer isso. principalmente a linha 5. Agora vai! hehe Muito obrigado Luiz!
public Turma() { //método construtor
Scanner scan = new Scanner(System.in);
Notas gerar = new Notas();
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("quantos alunos há na turma?"));
Aluno aluno[] = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
aluno[i].nome = JOptionPane.showInputDialog("Nome: ");
aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
aluno[i].genero = JOptionPane.showInputDialog("Gênero: ");
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
}
public void exibirTurma() { //método para exibir o dados, nesse caso só coloquei o nome
Aluno al[] = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
JOptionPane.showMessageDialog(null, al[i].nome);
}
}
}
O que faço de errado?
? alguém?
Qual erro?
Me deparei com um erro:Obs: Na classe principal instancio o objeto e chamo o método exibirTurmapublic Turma() { //método construtor Scanner scan = new Scanner(System.in); Notas gerar = new Notas(); this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("quantos alunos há na turma?")); Aluno aluno[] = new Aluno[this.numDeAlunos]; for (int i = 0; i < this.numDeAlunos; i++) { aluno[i] = new Aluno(); aluno[i].nome = JOptionPane.showInputDialog("Nome: "); aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: ")); aluno[i].genero = JOptionPane.showInputDialog("Gênero: "); for (int a = 0; a < 5; a++) { aluno[i].notas[a] = gerar.gerarNota(); } } } public void exibirTurma() { //método para exibir o dados, nesse caso só coloquei o nome Aluno al[] = new Aluno[this.numDeAlunos]; for (int i = 0; i < this.numDeAlunos; i++) { JOptionPane.showMessageDialog(null, al[i].nome); } } }O que faço de errado?
como o gerar notas recebe os parametros do aluno?
Onde vc declarou a variavel: numDeAlunos ? ela é int?
vc tem que postar o codigo do erro mostrado no output
Me deparei com um erro:aluno // declare aqui o array this.aluno public Turma() { //método construtor Scanner scan = new Scanner(System.in); Notas gerar = new Notas(); this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("quantos alunos há na turma?")); //Aluno aluno[] = new Aluno[this.numDeAlunos]; // esse aqui deveria ser o array this.aluno this.aluno[] = new Aluno[this.numDeAlunos]; // não esquecer de instanciar sua variavel this.aluno for (int i = 0; i < this.numDeAlunos; i++) { aluno[i] = new Aluno(); aluno[i].nome = JOptionPane.showInputDialog("Nome: "); aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: ")); aluno[i].genero = JOptionPane.showInputDialog("Gênero: "); for (int a = 0; a < 5; a++) { aluno[i].notas[a] = gerar.gerarNota(); } } } public void exibirTurma() { //método para exibir o dados, nesse caso só coloquei o nome //Aluno al[] = new Aluno[this.numDeAlunos]; // <=========== esse aluno al deveria ser: this.aluno for (int i = 0; i < this.numDeAlunos; i++) { JOptionPane.showMessageDialog(null, this.aluno[i].nome); } } }Obs: Na classe principal instancio o objeto e chamo o método exibirTurma
O que faço de errado?
releia leia o fonte.
vc precisa buscar algo sobre encapsulamento de variáveis.
import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
public Turma() {
Notas gerar = new Notas();
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
Aluno aluno[] = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
aluno[i].nome = JOptionPane.showInputDialog("Nome: ");
aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
aluno[i].genero = JOptionPane.showInputDialog("Gênero: ");
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
for (int i = 0; i < this.numDeAlunos; i++) {
System.out.println(aluno[i].nome + ", " + aluno[i].idade + ", " + aluno[i].genero);
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].notas[a]);
}
}
}
}
Mas eu queria criar um método separado só para exibir esses dados e nao exibi-los dentro desse método construtor. Como eu faço isso? é possível?
Eu não estou sabendo exibir os dados dos alunos. Só consigo dessa forma:import javax.swing.JOptionPane; public class Turma { int numDeAlunos; public Turma() { Notas gerar = new Notas(); this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?")); Aluno aluno[] = new Aluno[this.numDeAlunos]; for (int i = 0; i < this.numDeAlunos; i++) { aluno[i] = new Aluno(); aluno[i].nome = JOptionPane.showInputDialog("Nome: "); aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: ")); aluno[i].genero = JOptionPane.showInputDialog("Gênero: "); for (int a = 0; a < 5; a++) { aluno[i].notas[a] = gerar.gerarNota(); } } for (int i = 0; i < this.numDeAlunos; i++) { System.out.println(aluno[i].nome + ", " + aluno[i].idade + ", " + aluno[i].genero); System.out.println("Notas: \n"); for (int a = 0; a < 4; a++) { System.out.println(aluno[i].notas[a]); } } } }Mas eu queria criar um método separado só para exibir esses dados e nao exibi-los dentro desse método construtor. Como eu faço isso? é possível?
Vc sabe o que são métodos e funções e qual a diferença entre eles?
sabe quando um método alcança ou não uma variável de uma classe (encapsulamento)?
sabe executar um método ou função com passagem de parâmetros?
vc precisa saber isso.
http://www.leandro.wives.nom.br/java/oojava.htm
vc está declarando seu Aluno dentro do construtor. Esse é seu erro. O método exibirNotas não vai ter acesso à variavel se a variavel for declarada dentro do construtor.
Eu sei, pelo menos acho que sei oque é encapsulamento. Mas não entendi a conexão disso com encapsulamento. Não preciso ter métodos para acessar os atributos.. aliás se eu fizer métodos mesmo assim nao saberei como acessa-los nesse caso.
Veja oque eu fiz:import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
public void recebeDados() {
Notas gerar = new Notas();
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
Aluno aluno[] = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
aluno[i].nome = JOptionPane.showInputDialog("Nome: ");
aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
aluno[i].genero = JOptionPane.showInputDialog("Gênero: ");
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
}
public void exibirTurma() {
Aluno aluno[] = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
System.out.println(aluno[i].nome + ", " + aluno[i].idade + ", " + aluno[i].genero);
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].notas[a]);
}
}
}
}
Como resultado ele me exibe todos os valores nulos. Isso na verdade é de esperar. porque no método exibir notas me parece que estou sobrescrevendo oque escrevi em receberDados().
O que não consigo ver é como poderei acessar esses dados que acabei de "preencher" no método receberDados.
Eu acho que oque está me confundindo é esse vetor de objetos. Vamos supor que só exista a classe Aluno com o atributo CPF.
na classe principal eu faria o seguinte, criaria o objeto de Aluno (supomos o nome aluno) e em seguida teria acesso ao valor de CPF assim: aluno.CPF;
perfeito e fácil. Agora supomos que seja um vetor de vários objetos alunos cada um com um CPF. Como eu vou exibir o CPF de um por um? é isso que nao estou conseguindo.
Qual erro?
Exception in thread “main” java.lang.NullPointerException
at Pacote.Turma.exibirTurma(Turma.java:35)
at Pacote.Principal.main(Principal.java:11)
Indica que alguma coisa que foi usada na linha 35 não foi inicializada. Você inicializou todas as variáveis da classe Aluno?
Pode postar as classes Turma e Aluno completas?
Eu sei, pelo menos acho que sei oque é encapsulamento. Mas não entendi a conexão disso com encapsulamento. Não preciso ter métodos para acessar os atributos.. aliás se eu fizer métodos mesmo assim nao saberei como acessa-los nesse caso. Veja oque eu fiz:import javax.swing.JOptionPane; public class Turma { int numDeAlunos; Aluno aluno[]; // Aqui oh!!! sua variável tem ser tangível aos 2 métodos! public void recebeDados() { Notas gerar = new Notas(); this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?")); this.aluno[] = new Aluno[this.numDeAlunos]; // linha 12 for (int i = 0; i < this.numDeAlunos; i++) { this.aluno[i] = new Aluno(); this.aluno[i].nome = JOptionPane.showInputDialog("Nome: "); this.aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: ")); this.aluno[i].genero = JOptionPane.showInputDialog("Gênero: "); for (int a = 0; a < 5; a++) { this.aluno[i].notas[a] = gerar.gerarNota(); } } } public void exibirTurma() { //Aluno aluno[] = new Aluno[this.numDeAlunos]; //<=== pra que isso? linha 28 for (int i = 0; i < this.numDeAlunos; i++) { //aluno[i] = new Aluno(); // <=== pra que isso? assim vc não atinge o objeto da linha 12. System.out.println(this.aluno[i].nome + ", " + this.aluno[i].idade + ", " + this.aluno[i].genero); System.out.println("Notas: \n"); for (int a = 0; a < 4; a++) { System.out.println(this.aluno[i].notas[a]); } } } }Como resultado ele me exibe todos os valores nulos. Isso na verdade é de esperar. porque no método exibir notas me parece que estou sobrescrevendo oque escrevi em receberDados().
O que não consigo ver é como poderei acessar esses dados que acabei de "preencher" no método receberDados.
O objeto aluno da linha 12 não é o mesmo objeto da linha 28.
O objeto da linha 12 está recebendo as notas enquanto o da linha 28 não recebe notas.
As variáveis instanciadas dentro de um bloco de comandos entre chaves ("{}") só funcionam dentro daquele bloco.
Por isso que estou dizendo pra vc dar uma olhada em POO e encapsulamento.
Indica que alguma coisa que foi usada na linha 35 não foi inicializada. Você inicializou todas as variáveis da classe Aluno?Pode postar as classes Turma e Aluno completas?
package Pacote;
import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
public void receberQt() {
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
}
public void recebeDados() { //intuito de preencher os atributos dos "n" objetos aluno criados
Notas gerar = new Notas();
Aluno[] aluno = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
aluno[i].nome = JOptionPane.showInputDialog("Nome: ");
aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
aluno[i].genero = JOptionPane.showInputDialog("Gênero: ");
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
}
public void exibirTurma() { // esse é o método que nao consigo fazer. Como vou exibir os alunos?
// eu só consigo acessar lá dentro do método recebeDados
//fora dele nao sei como acessar pra exibir, os atributos dos diversos alunos
Aluno[] aluno = new Aluno[this.numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
System.out.println(aluno[i].nome + ", " + aluno[i].idade + ", " + aluno[i].genero);
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].notas[a]);
}
}
}
}
package Pacote;
public class Aluno {
public String nome;
public int idade;
public String genero;
public int notas[]=new int[5];
}
Eu já havia tentado fazer isso. Daí caio no erro:
Exception in thread “main” java.lang.NullPointerException
at Pacote.Turma.recebeDados(Turma.java:62)
at Pacote.Principal.main(Principal.java:9)
Segue o que o Luiz Augusto está falando, ele está certo.
Pra que eu iria encapsular os meus atributos de Aluno? eu só preciso ter acesso a eles. Não preciso necessariamente de métodos pra isso. Eu tentei do jeito que ele disse, mas não consigo mesmo assim. Dá erro
O código deveria ficar assim então:
package Pacote;
import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
Aluno[] aluno;
public void receberQt() {
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
}
public void recebeDados() {
Notas gerar = new Notas();
for (int i = 0; i < this.numDeAlunos; i++) {
aluno[i] = new Aluno();
aluno[i].nome = JOptionPane.showInputDialog("Nome: ");
aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog("Idade: "));
aluno[i].genero = JOptionPane.showInputDialog("Gênero: ");
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
}
public void exibirTurma() {
for (int i = 0; i < this.numDeAlunos; i++) {
System.out.println(aluno[i].nome + ", " + aluno[i].idade + ", " + aluno[i].genero);
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].notas[a]);
}
}
}
}
nesse caso o programa é construido com sucesso porém na hora de ser executado ele executa o método receberQt() e em seguida apresenta o erro
Exception in thread "main" java.lang.NullPointerException
at Pacote.Turma.recebeDados(Turma.java:20)
at Pacote.Principal.main(Principal.java:10)
package Pacote;
public class Principal {
public static void main(String args[]) {
Turma t = new Turma();
t.receberQt();
t.recebeDados();
t.exibirTurma();
}
}
encapsulamento é uma boa pratica de programação imagine que você tem um objeto que representa um funcionário este por sua vez tem um método “pegaPagamento()” que é uma forma encapsulada do valor que ele ganha.
Até um certo dia o valor que o funcionário ganha ficava armazenado no objeto já era o valor do salario + impostos (= Pagamento) mas um dia você pensou, pocha eu vou precisar separar os dois (o salario e o imposto) em duas variáveis diferente e a variável antiga chamado “Pagamento” morreu n existe mais, isso lhe trará muitos problemas se você não tiver encapsulado o campo. Pois você terá que sair procurando no seu código todos os lugares que você acessava direto aquela variável.
Mas se você tiver usado o método “pegaPagamento()” ao invés de acessar direto a variável o único lugar que você vai ter que alterar no seu código vai ser no método que ao invés de retornar a variável “Pagamento” ele retorna a soma do imposto + o salario
exemplo das classes :
//classe antes
public class funcionario {
private int Pagamento;
public int pegaPagamento(){
return this.pagamento;
}
}
//Depois da modificação
public class funcionario {
private int Salario;
private int Imposto;
public int pegaPagamento(){
return this.Salario + this.Imposto;
}
}
o que eu quero dizer com isso que mesmo você estando a fazer um pequeno programa é bom seguir as boas praticas elas evitam dor de cabeça no futuro, principalmente se o seu projeto for grande
o que eu quero dizer com isso que mesmo você estando a fazer um pequeno programa é bom seguir as boas praticas elas evitam dor de cabeça no futuro, principalmente se o seu projeto for grandevocê quer dizer pra fazer isso daqui?
package Pacote;
import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
Aluno[] aluno;
public void receberQt() {
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
}
public void recebeDados() {
Notas gerar = new Notas();
for (int i = 0; i < this.numDeAlunos; i++) {
//aluno[i] = new Aluno();
aluno[i]=new Aluno();
aluno[i].setNome(JOptionPane.showInputDialog("Nome: "));
aluno[i].setIdade(Integer.parseInt(JOptionPane.showInputDialog("Idade: ")));
aluno[i].setGenero(JOptionPane.showInputDialog("Gênero: "));
for (int a = 0; a < 5; a++) {
aluno[i].notas[a] = gerar.gerarNota();
}
}
}
public void exibirTurma() {
for (int i = 0; i < this.numDeAlunos; i++) {
System.out.println(aluno[i].getNome() + ", " + aluno[i].getIdade() + ", " + aluno[i].getGenero());
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].notas[a]);
}
}
}
}
package Pacote;
public class Aluno {
private String nome;
private int idade;
private String genero;
public int notas[] = new int[5];
public String getNome() {
return this.nome;
}
public void setNome(String name) {
this.nome = name;
}
public int getIdade() {
return this.idade;
}
public void setIdade(int age) {
this.idade = age;
}
public String getGenero() {
return this.genero;
}
public void setGenero(String gender) {
this.genero = gender;
}
/*public int[] getNotas() {
return this.notas;
}
public void setNotas(int[] notas) {
this.notas = notas;
}*/
}
ops, nao conseguir atribuir valores ao metodo setNotas().
a ideia é bem por ai mesmo criar esse tipo de encapsulamento, sei que pode parecer "inútil" a primeira vista mas vei eu já poupei muito tempo meu por causa disso
segue o como deve ser o set e get de nota
public int getNota(int index) {
return this.notas[index];
}
public void setNota(int index, int valor) {
this.notas[index] = valor;
}
Observe que agora que você encapsulou so seu getNota ele já poderia pegar a nota aleatória ao invés de fazer isso fora da classe.
O "gerador de notas" poderia ser aplicado no próprio método construtor da classe Aluno na verdade o próprio metodo "geraNota()" deveria pertencer (de forma privada) a classe Aluno visto que isso não será utilizado por nenhuma outra classe então n faz sentido ele e não está no aluno.
Obrigado pela dica Victor, farei assim daqui por diante. Agora resta saber ainda como solucionar meu problema. =/
desculpe mas n sei qual é o seu problema. Pera aew que vou ler aki xD
ahsush 
eu li aqui pelo que vi o seu você não está conseguindo imprimir na tela ? certo ?
aparentemente não vi nada errado, qual o erro que está dando ? e em que linha ele acontece ?
package Pacote;
import javax.swing.JOptionPane;
public class Turma {
int numDeAlunos;
Aluno[] aluno;
public void receberQt() {
this.numDeAlunos = Integer.parseInt(JOptionPane.showInputDialog("Quantos alunos ha na turma?"));
}
public void recebeDados() {
Notas gerar = new Notas();
for (int i = 0; i < this.numDeAlunos; i++) {
//aluno[i] = new Aluno();
aluno[i]=new Aluno();
aluno[i].setNome(JOptionPane.showInputDialog("Nome: "));
aluno[i].setIdade(Integer.parseInt(JOptionPane.showInputDialog("Idade: ")));
aluno[i].setGenero(JOptionPane.showInputDialog("Gênero: "));
for (int a = 0; a < 5; a++) {
aluno[i].setNotas(a, gerar.gerarNota());
}
}
}
public void exibirTurma() {
for (int i = 0; i < this.numDeAlunos; i++) {
System.out.println(aluno[i].getNome() + ", " + aluno[i].getIdade() + ", " + aluno[i].getGenero());
System.out.println("Notas: \n");
for (int a = 0; a < 4; a++) {
System.out.println(aluno[i].getNotas(a));
}
}
}
}
package Pacote;
public class Aluno {
private String nome;
private int idade;
private String genero;
private int notas[] = new int[5];
public String getNome() {
return this.nome;
}
public void setNome(String name) {
this.nome = name;
}
public int getIdade() {
return this.idade;
}
public void setIdade(int age) {
this.idade = age;
}
public String getGenero() {
return this.genero;
}
public void setGenero(String gender) {
this.genero = gender;
}
public int getNotas(int index) {
return this.notas[index];
}
public void setNotas(int index,int valor) {
this.notas[index] = valor;
}
}
package Pacote;
public class Principal {
public static void main(String args[]) {
Turma t = new Turma();
t.receberQt();
t.recebeDados();
t.exibirTurma();
}
}
e tem mais a classe la que gera a nota
como eu disse pelo que estou vendo aqui n há erro ou olhando eu n consigo encontrar
se você puder me passar a classe Nota ajudaria pois ai eu poderia tentar rodar o programa aqui
package Pacote;
public interface Nota {
public int gerarNota();
}
package Pacote;
import java.util.Random;
public class Notas implements Nota {
Random ran = new Random();
public int gerarNota() {
int nota = ran.nextInt(11);
return nota;
}
}
Tive que usar implements pois é uma exigencia do professor nesse exercicio avaliativo
achei o problema é bem simples
no seu método "recebeDados();" ele não inicializa o array, todo array em java deve ser inicializado para que a JVM calcule qual será o espaço dela na memoria do pc
então antes de usar um array você deve dizer o tamanho dele assim :
Aluno[] aluno = new Aluno[10];
o que eu quero falar para a JVM com isso escrito, "Separe na memoria 10 espaços para caber 10 alunos"
ou seja agora vc tem 10 espaços na memoria para colocar 10 alunos mas isso NÃO significa que tenha 10 alunos. uma analogia "não só porque um ônibus cabe 30 pessoas que nele vai ter dentro 30 pessoas"
você com isso tem o espaço mas em cada espaço você deve colocar um aluno diferente
public void recebeDados() {
Notas gerar = new Notas();
aluno = new Aluno[numDeAlunos];
for (int i = 0; i < this.numDeAlunos; i++) {
//aluno[i] = new Aluno();
aluno[i]= new Aluno();
aluno[i].setNome(JOptionPane.showInputDialog("Nome: "));
aluno[i].setIdade(Integer.parseInt(JOptionPane.showInputDialog("Idade: ")));
aluno[i].setGenero(JOptionPane.showInputDialog("Gênero: "));
for (int a = 0; a < 5; a++) {
aluno[i].setNotas(a, gerar.gerarNota());
}
}
}
Observe que dentro de cada espaço " i " o código instancia um novo aluno assim vai preenchendo o array xD
SHOW!!! finalmente… mas olha só…
na sua linha 05, se eu colocar ao invés do que tem lá: Aluno[] aluno=new Aluno[numDeAlunos] o programa da erro no final. Por que?
todo programador deve saber interpretar erro, e não é tão difícil assim observe no seu programa eu descobri o problema por causa do erro que o java me retornou
Exception in thread "main" java.lang.NullPointerException
at Pacote.Turma.recebeDados(Turma.java:21)
at Pacote.Principal.main(Principal.java:9)
vamos destrinchar ele
Exception in thread "main"
isso mostra em qual Thread ocorreu o erro provavelmente você não deve saber o que é Thread mas pergunte o seu professor
java.lang.NullPointerException
essa parte mostra a classe do erro ocorrido, é nessa parte que você sabe qual foi o tipo de erro
o NullPointException significa que você tentou usar um objeto o qual não foi inicializado
eu peguei essa descrição da documentação do java
“Thrown when an application attempts to use null in a case where an object is required”
traduzido
“Lançada quando um aplicativo tenta usar null em um caso em que é exigido um objeto”
at Pacote.Turma.recebeDados(Turma.java:21)
o que vem depois é sempre o Trace ou Rastreamento do erro então ele diz aqui que
o erro ocorreu na classe (Pacote.Turma) dentro do metodo (recebeDados) na linha 21 dessa classe (Turma.java:21)
o mesmo vale para a outra linha
po, legal isso! Victor, muito obrigado pela ajuda cara! aprendi bastante! Vou dormir agora pois amanha tenho que acordar as 7. Boa noite e obrigado mais uma vez.
SHOW!!! finalmente… mas olha só…
na sua linha 05, se eu colocar ao invés do que tem lá: Aluno[] aluno=new Aluno[numDeAlunos] o programa da erro no final. Por que?
lendo o erro você reconhece o problema
Exception in thread "main" java.lang.NullPointerException
at Pacote.Turma.exibirTurma(Turma.java:37)
at Pacote.Principal.main(Principal.java:10)
ele disse que eu tentei usar uma coisa que não foi inicializado “Null Pointer Exception”
o que acontece aqui e que o array aluno não foi inicializado
pois quando você mudou lá em cima
Aluno[] aluno=new Aluno[numDeAlunos]
você iniciou uma variável no escopo local do método que no caso é “recebeDados()” quando esse metodo terminou a varável da classe aluno continuou null pois hora nenhuma você colocou um valor nela
em outras palavras você criou uma segunda variável com o mesmo nome
a tah… é verdade. Acho que nao me restam dúvidas agora. Valewzasso victor
qualquer coisa você pode me perguntar pelo skype ou aki mesmo no forum
skype :lacerda1964