Erro na execução do meu programa - Exception in thread "main" java.lang.NullPointerException

Olá, estou fazendo uma atividade com o seguinte enunciado:

Você deverá implementar um relógio digital em Java. Para isso, você deverá criar três classes, a saber: Contador, Relogio e outra classe para testar a execução (aplicativo Java) com o nome TesteRelogio. Nas classes Contador e Relogio deverão constar os métodos modificadores e métodos de acesso para os atributos criados. O resultado da sua execução deverá exibir todos os horários possíveis do relógio, exemplo:

Formato 24 horas
00:00
00:01
00:02
00:03
00:04
00:05
.
.
.
23:59
Formato 12 horas
12:00 a.m.
00:01 a.m.
00:02 a.m.
.
.
.
11:54 p.m.
11:55 p.m.
11:56 p.m.
11:57 p.m.
11:58 p.m.
12:00 a.m.

Deverá existir uma opção para exibir as horas no formato 12 horas ou 24 horas. Caso seja feita a seleção para exibir no formato de 12 horas, deverá ser exibido a.m. ou p.m. conforme o caso.

Minhas classes são:

`public class Contador {

private int contar;

//Metodo construtor
public void Contador(){
    this.contar = 0;
}

//add 1
public void contar(){
    
    this.contar = (contar +1 ) % 100;
}

//set
public void setContar(int num){
    
    this.contar = num;
}

//get
public int getContar(){
    
    return this.contar;
}

}//end of class

public class Relogio {

//Campos da classe
private Contador minutos; 
private Contador horas;

//Constrio Objeto a partir da classe relogio relogio usando 2 objetos do tipo contador
public void Relogio(){
    
    this.horas = new Contador();
    this.minutos = new Contador();
    
}


//Metodos pra contar horas e minutos.
public void contarHoras(){
    
    int limitar;
    
    this.horas.contar();
    
    limitar = horas.getContar();
    
    limitar = ( limitar % 25 );
    
    this.horas.setContar(limitar); 
}

public void contarMinutos(){
    
    int limitar;
    
    this.minutos.contar();
    
    limitar = minutos.getContar();
    
    limitar = ( limitar % 61 );
    
    this.minutos.setContar(limitar);
}


//Metodos get e set dos campos da classe:

public void setHoras(int hs){
    
    this.horas.setContar( hs );
    
}//fim do SetHoras

public int getHoras(){
    
    return this.horas.getContar();
}//fim do getHoras

public void setMinuto(int m){
    
    this.minutos.setContar( m );
    
}//fim do SetMinuto

public int getMinutos(){
    
    return this.minutos.getContar();
}//fim do getMinutos


//Metodos para printar em formato 12 hs ou em formato 24 hs

public void metodo12hs(){

    int contador = 0;
    
    while(contador < 24){
    
        if(contador <= 12){
            
            System.out.print(getHoras() + ":" + getMinutos() + "a.m");
            
        }//end of if(contador <= 12)
        
        else{
        
            setHoras(1);//reiniciar o contador
            System.out.print(getHoras() + ":" + getMinutos() + "p.m");
            
        }//end of else
        
        contador++;
        contarHoras();
        contarMinutos();
        
    }//end of while(contador < 24)
}

public void metodo24hs(){
    
    //metodo a ser implementado, quero fazer o metodo12hs funcionar primeiro 

    
}

}//fim da Classe Relogio`

`import java.util.Scanner;

public class TesteRelogio {

public static void main(String[] args){

    Scanner input = new Scanner(System.in);
    Relogio rel = new Relogio();

    int op;
    
    

    while(true){

        System.out.print("Formato de horas: ");
        op = input.nextInt();
        
        switch(op){
            
            case 12: rel.metodo12hs(); break;
            
            case 24: rel.metodo24hs(); break;               
            
            
        }//end of switch(op)


    }//end of while(true)


  
  //rel.metodo12hs();

}//end of main method

}//end of class`

Ao copilar, apos escolher o formato 12 hs tenho a seguinte mensagem de erro:

Exception in thread “main” java.lang.NullPointerException
at Relogio.getHoras(Relogio.java:55)
at Relogio.metodo12hs(Relogio.java:80)
at TesteRelogio.main(TesteRelogio.java:22)
/home/thiago/.cache/netbeans/8.1/executor-snippets/run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)

Já tentei fazer alterações e inicialização de variáveis nos métodos que aparecem na mensagem de erro mas ate agora não encontrei o problema.

Se horas está nulo, você terá um NullPointerException. Que é o que está acontecendo.

1 curtida

Cara, o problema esta no método construtor. O correto seria:

`public Relogio(){ //sem void
this.horas = new Contador();
this.minutos = new Contador();

}`

Eu perguntei no stackoverflow e me responderam la. Da uma olhada se tiver interesse.
Obrigado.

Sim, se você não instanciou a variável horas, quando chegar naquele ponto, ela estará nula, dando o NPE.