Switch case default - COMO PARAR ?

O objetivo do while é fazer um loop a cada minuto.
nesse loop ele para nos minutos indicados no case do switch e envia uma lista.
Ele está parando no tempo certo porem quando ele encontra um desses minutos ele envia uma nova lista a cada 60 segundos sem parar.
O que posso colocar no default para que apareça nada quando não for algum case?

public static void iniciar() throws InterruptedException {
//criei esse método para iniciar o Sistema…
//agora vamos, dentro desse método:
// 1)Observar a hora;
// 2)quando chegar a hora especifica enviar uma lista de palavras;

    Date d = new Date();    //data atual da máquina        
    int minuto = d.getMinutes();
    System.out.println(d);
    
    while(minuto < 60) { //enquanto minuto for menor que 60...
        switch (minuto) {
        case 3:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        case 7:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        case 11:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        case 13:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        case 17:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        case 44: // VALOR PARA TESTE;
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        default:
            break;
        } //switch termina aqui
        
        Thread.sleep(60000); // 1 Segundo = 1000 Milissegundos | 1 Minuto = 60000 Milissegundos
    } //while termina aqui
}

Observe que a hora que iniciei o método foi um case então enviou a lista.
Mas o minuto seguinte não era case e continuou imprimindo a cada 60 segundos.

Obs: com o if/else não estava acontecendo isso…

Se funcionava antes por que mudou? Posta com if/else pro pessoal aqui ver a diferença.

na verdade mudei pq eu estava tentando usar o if assim:
if (minuto == 3 || 7) {
enviar_lista_de_palavras();
}

também tentei com && ao invés de || mas estava dando erro. Aí mudei pro switch pra tentar e tmb não deu. aí deixei assim

Fica mais prático jogar esses valores em um array e fazer um único if. Você pode usar isso na hora do if:

Esse código abaixo, com if, dá o seguinte erro:
Exception in thread “main” java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at pollyana.SistemaGeradorDeDominios.receba_a_lista(SistemaGeradorDeDominios.java:20)
at pollyana.SistemaFornecedorDePalavras.enviar_lista_de_palavras(SistemaFornecedorDePalavras.java:53)
at pollyana.SistemaFornecedorDePalavras.iniciar(SistemaFornecedorDePalavras.java:42)
at pollyana.SistemaFornecedorDePalavras.main(SistemaFornecedorDePalavras.java:12)

while(minuto < 60) { //enquanto minuto for menor que 60…
if (minuto == 3) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}
else if (minuto == 7) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}
else if (minuto == 11) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}
else if (minuto == 13) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}
else if (minuto == 17) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}
else if (minuto == 22) {
enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
}

        Thread.sleep(60000); // 1 Segundo = 1000 Milissegundos | 1 Minuto = 60000 Milissegundos
    } //while termina aqui

Nunca estás a alterar o minuto depois de entrar dentro do while. Aí ele vai “dormir” 60 segundos e mantem o mesmo valor no minuto, logo vai executar novamente.

while (true) {
    Date d = new Date();    //data atual da máquina        
    int minuto = d.getMinutes();
    System.out.println(d);

    switch (minuto) {
        case 3:
        case 7:
        case 11:        
        case 13:
        case 17:
        case 44:
            enviar_lista_de_palavras(); //esse método vai se comunicar com o SistemaGeradorDeDominios
            break;
        default:
            break;
    } //switch termina aqui
    
    Thread.sleep(60000); 
}
1 curtida

Erro de sintaxe, o correto é assim:

if (minuto == 3 || minuto == 7) {
    enviar_lista_de_palavras();
}

O erro de sintaxe foi corrigido porém continua a executar repetidas vezes após encontrar o minuto indicado.

Para simplificar eu isolei o método em uma classe só:
coloquei seconds ao inves de minutes pra facilitar a verificação

public static void iniciar() throws InterruptedException {
        
        Date d = new Date();    //data atual da máquina        
        int minuto = d.getSeconds(); //aqui coloquei seconds ao inves de minutes pra facilitar a verificação
        System.out.println(d);
        
        while(minuto < 60) { //enquanto minuto for menor que 60...
            if ( minuto == 3 || minuto == 7 || minuto == 11 || minuto == 13 || minuto == 17) {
                System.out.println("minuto indicado");
            }
            else {
                
            }
            Thread.sleep(1000); // 1 Segundo = 1000 Milissegundos | 1 Minuto = 60000 Milissegundos
        } //while termina aqui
    }

Acontece que quando eu executo exatamente no segundo indicado ele imprime o que foi pedido naquele segundo e ele repete o que foi impresso de segundo em segundo(thread.sleep)
E se por um acaso eu executar fora do segundo indicado ele não reconhece o comando if em momento algum. Reconhece apenas o else.

o @pmlm já postou a solução.

Para seu caso especifico recomendo você a utilizar Timer e TimerTask, pois eles executam uma função repetidamente em um tempo predeterminado.

Tem certeza de que o método enviar_lista_de_palavras() não está chamando o método iniciar()?
Posta o código do método enviar_lista_de_palavras().

System.out.println("nada");

No método receba_a_lista da classe SistemaGeradorDeDominios, mais precisamente na linha 20, você está tentando atribuir um objeto do tipo ArrayList para uma variável do tipo String.

Uffff… pensei que era invisivel e ninguém via :slight_smile: