Ajuda em NullPointerException

Olá pessoal, boa tarde, estou tendo um problema de Exception in thread “main” java.lang.NullPointerException no código abaixo e não sei por que, podem me ajudar? Grato

import java.util.Scanner;

public class Exercicio3 {

public static void main(String[] args){
    
    Scanner scan = new Scanner(System.in);  
    
    int numPessoas;
    String escolhaSexo;
    String escolhaOlhos;
    String escolhaCabelo; 
    
    System.out.println("Informe a quantidade de pessoas na pesquisa: ");
    System.out.print("-> ");
    numPessoas = scan.nextInt();            
    Pessoa[] pessoa = new Pessoa[numPessoas];        
    
    for(int i = 0; i < numPessoas; i++){
        System.out.println("");
        pessoa[i] = new Pessoa();

        System.out.println("Informe o nome da pessoa "+ (i+1));
        System.out.print("-> ");            
        pessoa[i].setName(scan.next());
        
        System.out.println("Escolha o sexo de "+ pessoa[i].getName());
        System.out.println("1 - Masculino");
        System.out.println("2 - Feminino");
        System.out.print("-> ");            
        escolhaSexo = scan.next();
        while(!(escolhaSexo.equals("2")) && !(escolhaSexo.equals("1"))){
            switch (escolhaSexo) {
                case "1":
                    pessoa[i].setSexo("Masculino");
                    break;
                case "2":
                    pessoa[i].setSexo("Feminino");
                    break;
                default:
                    System.out.println("");
                    System.out.println("Opção inválida, escolha a opção 1 ou 2");
                    System.out.print("-> ");
                    escolhaSexo = scan.next();
            }
        }
        System.out.println("");
        System.out.println("Escolha a cor dos olhos de "+ pessoa[i].getName());
        System.out.println("1 - Azuis");
        System.out.println("2 - Verdes");
        System.out.println("3 - Castanhos");
        System.out.print("-> ");            
        escolhaOlhos = scan.next();
        while(!(escolhaOlhos.equals("1")) && !(escolhaOlhos.equals("2")) && 
              !(escolhaOlhos.equals("3"))){
            switch (escolhaOlhos) {
                case "1":
                    pessoa[i].setOlhos("Azuis");
                    break;
                case "2":
                    pessoa[i].setOlhos("Verdes");
                    break;
                case "3":
                    pessoa[i].setOlhos("Castanhos");
                    break;
                default:
                    System.out.println("");
                    System.out.println("Opção inválida, escolha uma opção de 1 a 3");
                    System.out.print("-> ");
                    escolhaOlhos = scan.next();
            }
        }
        System.out.println("");
        System.out.println("Escolha a cor do cabelos de "+ pessoa[i].getName());
        System.out.println("1 - Louro");
        System.out.println("2 - Castanho");
        System.out.println("3 - Preto");
        System.out.print("-> ");
        escolhaCabelo = scan.next();
        while(!(escolhaCabelo.equals("1")) && !(escolhaCabelo.equals("2")) && 
              !(escolhaCabelo.equals("3"))){
            switch (escolhaCabelo) {
                case "1":
                    pessoa[i].setCabelo("Louro");
                    break;
                case "2":
                    pessoa[i].setCabelo("Castanho");
                    break;
                case "3":
                    pessoa[i].setCabelo("Preto");
                    break;
                default:
                    System.out.println("");
                    System.out.println("Opção inválida, escolha uma opção de 1 a 3");
                    System.out.print("-> ");
                    escolhaCabelo = scan.next();
            }
        }
        System.out.println("");
        System.out.println("Informe a idade de "+ pessoa[i].getName());
        System.out.print("-> ");
        pessoa[i].setIdade(scan.nextInt());
                   
    }        
    System.out.println("");
    String pessoaVelha = "";
    int maior = pessoa[0].getIdade();        
    for(int i = 0; i <numPessoas; i++){
        int idade = pessoa[i].getIdade();
        if(idade >= maior){
            maior = idade;
            pessoaVelha = pessoa[i].getName();
        }            
    }System.out.println(pessoaVelha +" é pessoa mais velha e tem " + maior + " anos"); 
    System.out.println("");
    
    double percent;
    int contagem = 0;
    for(int i = 0; i < numPessoas; i++){
        String sexo = pessoa[i].getSexo(), 
               olhos = pessoa[i].getOlhos(),
               cabelo = pessoa[i].getCabelo();
        int idade = pessoa[i].getIdade();
        
        if((sexo.equals("Feminino")) && ((idade >= 18) && (idade <= 35))
           && (olhos.equals("Verdes")) && (cabelo.equals("Louro"))){
           contagem += 1;
        }else{}
        
    }percent = (100*contagem)/numPessoas;        
    System.out.println("A porcentagem de pessoas do sexo feminino com idade entre 18 e 35 anos, "
            + "com olhos verdes e cabelos louros é de "+percent+"%");        
}    

}

Poste o stacktrace do erro.

1 curtida

Exception in thread “main” java.lang.NullPointerException
at Exercicio3.main(Exercicio3.java:126)
C:\Users\ ************\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 30 segundos)

Quando vc faz algo do tipo:
olhos.equals("Verdes")
se olhos for NULL vai dar NullPointerException.
Vc pode prevenir fazendo:
olhos != null && olhos.equals("Verdes")

Ou faça:
Objects.equals(olhos, "Verdes")

*isso vale para as outras variáveis tbm.

1 curtida

Mas eu obrigo o usuário escolher uma opção, olhos nunca vai ser null por isso fiz o looping.

Seu nullPointer é nesta linha.
Pelo que vc postou era naquele if. Ou o que vc tem na linha 126 ai?

Sim, meu if ta na 126, mas se não foi igual a “Verdes” vai ser outra opção que o usuário inputou, ou seja, vai dar falso e não vai conta, isso que deveria acontecer… mas ok, vou tentar o que vc sugeriu.

NÃO. se for NULL vai dar erro! Entenda que null não é um valor. É diferente se fosse “” String vazia.
Vc chamar um método de um objeto nulo vai dar erro.

2 curtidas

Como dito antes, null é diferente de vazio. Uma variável nula é quando a variável existe no seu código, mas ao ser acessada, não existe informação nenhuma sobre ela na memória, já que não é possível comparar, por exemplo, laranjas com nada.

Dá uma lida nesse post pra entender melhor: Significado da palavra null

1 curtida

O correto para evitar NullPointers indesejáveis quando está utilizando o equals para comparação, é usar a constante com o objeto desejado na comparação, ou seja:

"Verdes".equals(olhos)

Nesse caso, se olhos for null não vai ocorrer o erro.

2 curtidas

mexi no que usa a variavel escolhaSexo daí vc segue o exemplo, como diz o velho ditado a lógica tava certa só que estava na linha errada…hehe…segue:

System.out.println("Informe o nome da pessoa " + (i + 1));
        System.out.print("-> ");
        pessoa[i].setName(scan.next());

        while (!(escolhaSexo.equals("2")) && !(escolhaSexo.equals("1"))) {
            System.out.println("Escolha o sexo de " + pessoa[i].getName());
            System.out.println("1 - Masculino");
            System.out.println("2 - Feminino");
            System.out.print("-> ");
            escolhaSexo = scan.next();

        }
        switch (escolhaSexo) {
            case "1":
                pessoa[i].setSexo("Masculino");
                break;
            case "2":
                pessoa[i].setSexo("Feminino");
                break;
            default:
                System.out.println("");
                System.out.println("Opção inválida, escolha a opção 1 ou 2");
                System.out.print("-> ");
                escolhaSexo = scan.next();
        }
        System.out.println("");
        System.out.println("Escolha a cor dos olhos de " + pessoa[i].getName());

OBs.: Não esqueça de iniciar as variáveis

String escolhaSexo = "";
    String escolhaOlhos = "";
    String escolhaCabelo = "";
1 curtida