Erro(java.lang.NullPointerException)

6 respostas
denisagui

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:
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)));
	}
MÉTODOS UTILIZADOS:
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);
	}

obrigado a todos, fico no aguardo...

6 Respostas

R

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 =)

denisagui
certo.
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);
	}
}

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)

R

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

mas parece q o problema se resolveria assim...

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);  
    }
denisagui

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

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;
	}

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

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

- inserir um contador pra ver qntas pessoas foram cadastradas... o metodo ficaria assim:

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

- pode tambem fazer uma verificação igual ja te mostrei

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

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

public static float percentDengue(ArrayList<Pessoa> 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);  
    }
denisagui

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

Criado 21 de março de 2011
Ultima resposta 21 de mar. de 2011
Respostas 6
Participantes 2