Erro(java.lang.NullPointerException)

olá a todos… tenho um trabalho da universidade onde é pedido para receber alguns valores, e calcular porcentagens, só que o erro java.lang.NullPointerException está aparecendo mesmo depois que eu ja realizei a construção e as variareis estão alocadas, alguém saber me dizer o porque ? desde ja agradeço a todos!

MÉTODO CONSTRUTOR:

Pessoa(String nome, int idade, int sexo, int dengue){ this.nome = nome; this.idade = idade; this.sexo = sexo; this.dengue = dengue; }

INICIALIZANDO:

for(int cont = 0; cont < N; cont++){ pessoa[cont] = new Pessoa(nome, idade, sexo, dengue);

CHAMADA:

[code]public static void imprimir(Pessoa pessoa[]){

	DecimalFormat mask = new DecimalFormat("00.00 %");
	
	System.out.println("\t\t\t ..::RELATORIO::..");
	System.out.println("Percentual de pessoas com dengue: "+ mask.format(percentDengue(pessoa)));
	System.out.println("Percentual de homens que já tiveram dengue: " + mask.format(percentHomensDengue(pessoa)));
	System.out.println("Percentual de crianças com até 12 anos que já tiveram dengue: " + mask.format(percentCriancaDengue(pessoa)));
}[/code]

MÉTODOS UTILIZADOS:

[code]public static float percentDengue(Pessoa pessoa[]){

	float total = 0;
	
	for(int cont = 0; cont < pessoa.length; cont++){
		if(pessoa[cont].getDengue() == 1)
			total++;
	}
	
	return (((pessoa.length / total )-1)*100);
}

public static float percentHomensDengue(Pessoa pessoa[]){
	
	float total = 0;
			
	for(int cont = 0; cont < pessoa.length; cont++){
		if(pessoa[cont].getSexo() == 1){
			if(pessoa[cont].getDengue() == 1)
				++total;
		}
	}
	
	return (((pessoa.length / total  )-1)*100);
}

public static float percentCriancaDengue(Pessoa pessoa[]){
	
	float total = 0;
			
	for(int cont = 0; cont < pessoa.length; cont++){
		if(pessoa[cont].getIdade() < 12){
			if(pessoa[cont].getDengue() == 1)
				++total;
		}
	}
	
	return (((pessoa.length/ total)-1)*100);
}[/code]

obrigado a todos, fico no aguardo…

coloca ae o codigo da classe q vc cria Pessoa
e coloca tb o printstack do erro que é facil e rapido descobrir o problema… é só copiar a pilha de erros do console e colocar aqui =)

certo.

[code]import java.util.InputMismatchException;

public class Principal {

public static void main(String[] args) {
	
	final int N = 100;
	Pessoa pessoa[] = new Pessoa[N]; 
	int op = 0;
	boolean val = true;
			
	String nome = new String();
	int idade = 0; 
	int sexo = 0;
	int dengue = 0;
	
	
	System.out.println("..::PESQUISA::..");
	
	for(int cont = 0; cont < N; cont++){
		do{
			System.out.println("Digite o nome: ");
			nome = Servicos.recebeString();
			
			if(!Validacao.validaString(nome))
				System.out.println("Nome Vazio... Digite novamente...");
			
		}while(!Validacao.validaString(nome));
			
		do{
			val = true;
			try{
				System.out.println("Digite a Idade: ");
				idade = Servicos.recebeInt();
				
				if(!Validacao.validaIdade(idade)){
						System.out.println("Idade invalida... Digite novamente.");
						val = false;
				}
				
			} catch (InputMismatchException exception){
				System.out.println("O valor informado não é valido. Digite novamente");
				val = false;
				}
							
		}while(!val);
		
				
		do{
			val = true;
			try{
				System.out.println("Digite o Sexo: (1 - Masculino / 2 - Feminino)");
				sexo = Servicos.recebeInt();
				
				if(!Validacao.validaOpcao(sexo)){
					System.out.println("Sexo invalido... Digite novamente.");
					val = false;
				}
			
			} catch (InputMismatchException exception){
				System.out.println("O valor informado não é valido. Digite novamente");
				val = false;
				}
			
		}while(!val);
		
				
		do{
			val = true;
			try{
				System.out.println("Já teve Dengue ? (1 - Sim / 2 - Não)");
				dengue = Servicos.recebeInt();
				
				if(!Validacao.validaOpcao(dengue)){
					System.out.println("Opção invalido... Digite novamente.");
					val = false;
				}
				
				
			} catch (InputMismatchException exception){
				System.out.println("O valor informado não é valido. Digite novamente");
				val = false;
				}
			
		}while(!val);
		
		pessoa[cont] = new Pessoa(nome, idade, sexo, dengue);
		
		do{
			val = true;
			try{
				System.out.println("Deseja continuar registrando ? (1 - Sim/ 2 - Não)");
				op = Servicos.recebeInt();
				
				if(!Validacao.validaOpcao(op)){
					System.out.println("Opção invalido... Digite novamente.");
					val = false;
				}
				
			} catch (InputMismatchException exception){
				System.out.println("O valor informado não é valido. Digite novamente");
				val = false;
				}
			
		}while(!val);
		
		if(op == 2)
			break;
	}
			
	Servicos.imprimir(pessoa);
}

}[/code]

erros:

Exception in thread “main” java.lang.NullPointerException
at Aula8Exer1.Servicos.percentDengue(Servicos.java:30)
at Aula8Exer1.Servicos.imprimir(Servicos.java:70)
at Aula8Exer1.Principal.main(Principal.java:125)

rapaz… vc nao passou o codigo completo entao nao tem como eu debugar =p

mas parece q o problema se resolveria assim…

[code]public static float percentDengue(Pessoa pessoa[]){

    float total = 0;  
      
    for(int cont = 0; cont < pessoa.length; cont++){  

        if ( pessoa[cont] == null )
            continue;   

        if(pessoa[cont].getDengue() == 1)  
            total++;  
    }  
      
    return (((pessoa.length / total )-1)*100);  
} 

[/code]

codigo completando o que tava faltando… a parte de cima não ta dando muito efeito… abraçç

[code]public class Pessoa {
private String nome = new String();
private int idade;
private int sexo;
private int dengue;

public void setNome(String nome){
	this.nome = nome;
}

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

public void setSexo(int sexo){
	this.sexo = sexo;
}

public void setDengue(int dengue){
	this.dengue = dengue;
}

public String getNome(){
	return nome;
}

public int getIdade(){
	return idade;
}

public int getSexo(){
	return sexo;
}

public int getDengue(){
	return dengue;
}

Pessoa(String nome, int idade, int sexo, int dengue){
		this.nome = nome;
		this.idade = idade;
		this.sexo = sexo;
		this.dengue = dengue;
}

}
[/code]

import java.util.Scanner;
import java.text.DecimalFormat;

public class Servicos {
	
	public static String recebeString(){
		Scanner input = new Scanner(System.in);
		
		return input.nextLine();
	}
	
	public static int recebeInt(){
		Scanner input = new Scanner(System.in);
		
		return input.nextInt();
	}
	
	public static float percentDengue(Pessoa pessoa[]){
		
		float total = 0;
		
		for(int cont = 0; cont < pessoa.length; cont++){
			if(pessoa[cont] == null)
				continue;
			if(pessoa[cont].getDengue() == 1)
				total++;
		}
		
		return (((pessoa.length / total )-1)*100);
	}
	
	public static float percentHomensDengue(Pessoa pessoa[]){
		
		float total = 0;
				
		for(int cont = 0; cont < pessoa.length; cont++){
			if(pessoa[cont].getSexo() == 1){
				if(pessoa[cont].getDengue() == 1)
					++total;
			}
		}
		
		return (((pessoa.length / total  )-1)*100);
	}
	
	public static float percentCriancaDengue(Pessoa pessoa[]){
		
		float total = 0;
				
		for(int cont = 0; cont < pessoa.length; cont++){
			if(pessoa[cont].getIdade() < 12){
				if(pessoa[cont].getDengue() == 1)
					++total;
			}
		}
		
		return (((pessoa.length/ total)-1)*100);
	}
	
	public static void imprimir(Pessoa pessoa[]){
		
		DecimalFormat mask = new DecimalFormat("00.00 %");
		
		System.out.println("\t\t\t ..::RELATORIO::..");
		System.out.println("Percentual de pessoas com dengue: "+ mask.format(percentDengue(pessoa)));
		System.out.println("Percentual de homens que já tiveram dengue: " + mask.format(percentHomensDengue(pessoa)));
		System.out.println("Percentual de crianças com até 12 anos que já tiveram dengue: " + mask.format(percentCriancaDengue(pessoa)));
	}
	
	public static void print(Pessoa pessoa[]){
		for(int cont=0; cont < 10; cont++){
			System.out.println("nome :"+pessoa[cont].getNome());
			System.out.println("ideda :"+pessoa[cont].getIdade());
			System.out.println("sexo :"+pessoa[cont].getSexo());
			System.out.println("dengue :"+pessoa[cont].getDengue());
		}
	}
}

[code]public class Validacao {

public static boolean validaString(String string){
	if(string.length() == 0)
		return false;
	return true;
}

public static boolean validaOpcao(int op){
	if((op < 1)||(op > 2))
		return false;
	return true;
}

public static boolean validaIdade(int idade){
	if((idade < 0)||(idade >120))
		return false;
	return true;
}

}
[/code]

então… debuguei aqui e o erro é o seguinte

no metodo percentDengue, qndo vc faz o for, vc percorre até pessoa.length mas esse valor é o tamanho maximo do seu vetor… se vc inseriu 10 pessoas, ele vai percorrer até 100 q é o tamanho maximo do seu vetor… dae uma hora vai chegar no valor null qndo vc tentar usar o getDengue… a não ser que vc preencha o vetor inteiro…

Vc pode arrumar isso de 3 maneiras… Mas lembre-se de que vc tem que alterar os metodos percentDengue, percentHomensDengue e percentCriancaDengue pq os 3 são semelhantes ( da até pra vc criar um método só, passando no parâmetro o q vc quer que retorna mas dae ja vou confundir um pouco vc… )

Escolhe uma das opções :stuck_out_tongue:

  • inserir um contador pra ver qntas pessoas foram cadastradas… o metodo ficaria assim:

[code] public static float percentDengue(Pessoa pessoa[], int pessoasCadastradas ){

    float total = 0;  

// onde pessoas cadastradas é o numero de pessoas cadastradas
for(int cont = 0; cont <= pessoasCadastradas; cont++){
if(pessoa[cont].getDengue() == 1)
total++;
}

    return (((pessoa.length / total )-1)*100);  
}[/code]
  • pode tambem fazer uma verificação igual ja te mostrei

[code] public static float percentDengue(Pessoa pessoa[]){

    float total = 0;  

    if ( pessoa[cont] == null ) 
    continue; 
    
    for(int cont = 0; cont < pessoa.length; cont++){  
        if(pessoa[cont].getDengue() == 1)  
            total++;  
    }  
      
    return (((pessoa.length / total )-1)*100);  
}[/code]
  • ou o melhor e mais organizado… inserir em um ArrayList ao invés de um array

onde vc cria pessoas vc iria inserir no arrayList

ArrayList<Pessoa> pessoa= new ArrayList<Pessoa>(); // como uma variavel global pessoa.add( new Pessoa( nome, idade, sexo, dengue ));

dae onde vc faz o for ficaria dessa maneira:

[code] public static float percentDengue(ArrayList pessoa ){

    float total = 0;  
    
    for(int cont = 0; cont < pessoa.size(); cont++){  
        if(pessoa.get( cont ).getDengue() == 1 )  
            total++;  
    }  
      
    return (((pessoa.size() / total )-1)*100);  
}  [/code]

deu certo… muito obrigado por tudo !!!
vlw redr4gon