Boa noite, tive dúvidas em como passar um array de um construtor em outra classe, segue abaixo as três classes utilizadas. O objetivo é calcular o IMC de um conjunto de pessoas (ainda está na metade do código, pois parei nessa dúvida). No total são três classes, um para os dados de cada pessoa, outra para a instituição e outra para “juntar” as duas.
public class Pessoasatt {
String nome;
String sexo;
long cpf;
float peso;
float altura;
}
public class Instituicao {
public int num=2;
String nome;
long cnpj;
Pessoasatt p[]=new Pessoasatt[num];
Instituicao(String nome, long cnpj){
this.nome=nome;
this.cnpj=cnpj;
this.p=new Pessoasatt[num];
}
}
E abaixo veio minha dúvida na realização do código:
public class Ex3att {
public static int num=2;
static String nome;
static long cnpj;
static Scanner input=new Scanner(System.in);
static Instituicao insti=new Instituicao(nome,cnpj);
public static void main(String[] args) {
System.out.println("\t****Sistema de IMC***\n");
System.out.println("\nInforme o nome da Empresa: ");
insti.nome=input.nextLine();
System.out.println("Informe o CNPJ:");
insti.cnpj=input.nextLong();
for(int i=0;i<num;i++) {
System.out.println("Informe o nome da pessoa: ");
insti.p[i].nome=input.nextLine();
}
}
}
Quando peço para pegar o nome da pessoa dá esse erro:
Exception in thread "main" java.lang.NullPointerException
at exerciciosTreino/exerciciosStruct.Ex3.Ex3att.main(Ex3att.java:20)
Me ajudem por favor, pois comecei em c há um tempo e comecei com java por agora.
Se voce ja iniciou o array na declaracao, nao precisa inicializar ele no construtor. nem mesmo declarar. e voe nao esta colcando nada dentro do array. o que é para guardar nele? uma instituicao?
Ahh entendi, no array seriam colocados os dados de uma pessoa, fazendo o cadastro de várias pessoas. Então fiquei na dúvida de como coloco algo nele antes da entrada de dados pelo Scanner.
nome = scanner.readLine();
sexo = scanner.readLine();
...
Pessoa pessoa = new Pessoa(nome, sexo);
instituicao.adicionarPessoas(pessoa);
//na sua classe instituicao devera ter:
public void adicionarPessoas(Pessoa pessoa) {
pessoas[pessoas.length()-1] = pessoa;
num++;
}
No caso da classe instituição você pode passar a quantidade de pessoas que você deseja informar os dados, lembrando que um construtor é útil para inicializar valores em um objeto. Você também pode criar um método que será responsável por adicionar o objeto pessoa ao array. Da mesma forma você poderá criar um método para imprimir a lista das pessoas da instituição.
Exemplo:
public class Instituicao {
private String nome;
private String cnpj;
private Pessoa[] lista;
public Instituicao(String nome, String cnpj, int numeroDePessoas) {
this.nome = nome;
this.cnpj = cnpj;
this.lista = new Pessoa[numeroDePessoas];
}
public void adicionarPessoa(int posicao, Pessoa pessoa) {
lista[posicao] = pessoa;
}
public void imprimirListaDePessoas() {
StringBuilder sb = new StringBuilder();
sb.append("::: DADOS DA INSTITUICAO :::\n");
sb.append("Nome: " + nome + "\n");
sb.append("CNPJ: " + cnpj + "\n\n");
sb.append("::: LISTA DE PESSOAS :::\n");
for (int i = 0; i < lista.length; i++) {
sb.append(lista[i] + "\n");
}
System.out.println(sb.toString());
}
}
Obs: Você sobrescrever o método toString() na classe pessoa.
Exemplo: @Override
public String toString() {
return “Nome: " + nome + " Sexo: " + sexo + " IMC = " + String.format(”%.2f", calcularIMC());
}
Na classe do programa onde você deverá instanciar o objeto instituicao, você pode usar um for para garantir que o total de pessoas não ultrapassará o limite do seu array, desta forma você evitará o Exception: java.lang.NullPointerException. Veja o exemplo abaixo:
public class ExercicioIMC {
public static void main(String[] args) {
// TODO Auto-generated method stub
Locale.setDefault(Locale.US);
Scanner sc = new Scanner(System.in);
System.out.print("Quantas pessoa(s) deseja informa? ");
int n = sc.nextInt();
System.out.println();
System.out.println("::: DADOS DA INSTITUICAO :::");
System.out.print("Nome: ");
String nomeDaInstituicao = sc.next();
System.out.print("CNPJ: ");
String cnpj = sc.next();
Instituicao instituicao = new Instituicao(nomeDaInstituicao, cnpj, n);
System.out.println();
System.out.println("::: Informe os dados da(s) Pessoa(s) :::");
for (int i = 0; i < n; i++) {
System.out.println("Pessoa #" + (i + 1) + " :");
System.out.print("Nome: ");
String nome = sc.next();
System.out.print("Sexo (Feminina;Masculino): ");
String sexo = sc.next();
System.out.print("CPF: ");
String cpf = sc.next();
System.out.print("Peso: ");
float peso = sc.nextFloat();
System.out.print("Altura: ");
float altura = sc.nextFloat();
// o i informa a posição em que o objeto pessoa deverá ser inserida no array.
instituicao.adicionarPessoa(i, new Pessoa(nome, sexo, cpf, peso, altura));
}
System.out.println();
// aqui você pode utilizar o método criado na classe instituicao para imprimir o seu array.
instituicao.imprimirListaDePessoas();
sc.close();
}