N objetos

38 respostas
K

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.

38 Respostas

Luiz_Augusto_Prado

killerkill:
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…

K
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?

Luiz_Augusto_Prado
<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.
 }
K

isso isso isso.
eu nao sabia como fazer isso. principalmente a linha 5. Agora vai! hehe Muito obrigado Luiz!

K
Me deparei com um erro:
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);

        }


    }
}
Obs: Na classe principal instancio o objeto e chamo o método exibirTurma

O que faço de errado?

K

? alguém?

ViniGodoy

Qual erro?

Luiz_Augusto_Prado
killerkill:
Me deparei com um erro:
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);

        }


    }
}
Obs: Na classe principal instancio o objeto e chamo o método exibirTurma

O que faço de errado?

como o gerar notas recebe os parametros do aluno?

Luiz_Augusto_Prado

Onde vc declarou a variavel: numDeAlunos ? ela é int?

vc tem que postar o codigo do erro mostrado no output

Luiz_Augusto_Prado

killerkill:
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.

K
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?

Luiz_Augusto_Prado
killerkill:
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.

K

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.

K

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.

K

Qual erro?

Exception in thread main java.lang.NullPointerException

at Pacote.Turma.exibirTurma(Turma.java:35)

at Pacote.Principal.main(Principal.java:11)
ViniGodoy

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?

Luiz_Augusto_Prado
killerkill:
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.

K
ViniGodoy:
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(&quot;Quantos alunos ha na turma?&quot;));
    }

    public void recebeDados() { //intuito de preencher os atributos dos &quot;n&quot; objetos aluno criados

        Notas gerar = new Notas();
        Aluno[] aluno = new Aluno[this.numDeAlunos];

        for (int i = 0; i &lt; this.numDeAlunos; i++) {
            aluno[i] = new Aluno();
            aluno[i].nome = JOptionPane.showInputDialog(&quot;Nome: &quot;);
            aluno[i].idade = Integer.parseInt(JOptionPane.showInputDialog(&quot;Idade: &quot;));
            aluno[i].genero = JOptionPane.showInputDialog(&quot;Gênero: &quot;);
            for (int a = 0; a &lt; 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 &lt; this.numDeAlunos; i++) {
            aluno[i] = new Aluno();
            System.out.println(aluno[i].nome + &quot;, &quot; + aluno[i].idade + &quot;, &quot; + aluno[i].genero);
            System.out.println(&quot;Notas: \n&quot;);
            for (int a = 0; a &lt; 4; a++) {
                System.out.println(aluno[i].notas[a]);
            }
        }

    }
}
A classe Aluno só tem a criação dos atributos:
package Pacote;

public class Aluno {

    
    public String nome;
    public int idade;
    public String genero;
    public int notas[]=new int[5];



}
K
Eu  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)
ViniGodoy

Segue o que o Luiz Augusto está falando, ele está certo.

K

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

K

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();
    }
}
V

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

K
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
você 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().

V

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.

K

Obrigado pela dica Victor, farei assim daqui por diante. Agora resta saber ainda como solucionar meu problema. =/

V

desculpe mas n sei qual é o seu problema. Pera aew que vou ler aki xD

ahsush :slight_smile:

V

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 ?

K
Sim, olha o meu código final como está:
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

V

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

K
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

V

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

K

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?

V

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

K

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.

V

killerkill:
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

K

a tah… é verdade. Acho que nao me restam dúvidas agora. Valewzasso victor

V

qualquer coisa você pode me perguntar pelo skype ou aki mesmo no forum

skype :lacerda1964

Criado 4 de julho de 2013
Ultima resposta 8 de jul. de 2013
Respostas 38
Participantes 4