[RESOLVIDO] Dúvida iniciante - DESPERTADOR JAVA

Galera, boa tarde.
Sou iniciante em java, e tô tentando criar um despertador APENAS com o que já aprendi, que é o que consta no código abaixo.
Porém, estou recebendo erro ao tentar utilizar WHILE.
A lógica seria que enquanto horaatual for diferente de horareal E minutoatual for diferente de minutoreal, o programa não faz nada e, SE horaatual for igual horareal E minutoatual for igual a minutoreal, o programa imprime uma mensagem no console.

Podem me ajudar a achar onde está errado?

package teste;

import java.util.Scanner;

public class Teste {

public static void main(String[] args) {

long totalMilisegundos = System.currentTimeMillis() - 10800000;

long totalSegundos = totalMilisegundos / 1000;
long segundosAtual = totalSegundos % 60;

long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;

long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;

System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);

    Scanner input = new Scanner(System.in);
    System.out.println("Digite a hora para despertar:");
    long hora = input.nextLong();
    
    System.out.println("Digite os minutos para despertar:");
    long minutos = input.nextLong();
    
    System.out.println("Você configurou o despertador para: " + hora + ":" + minutos);
    
    System.out.println("Digite a tarefa à agendar:");
    String agenda = input.next();
    
    long x = 0;
    
    while(horasAtualVerao != hora & x = 0 ){
    
    }
    if (horasAtualVerao = hora  || minutosAtual = minutos) {
    System.out.println(agenda);
    long x = 1;
    }    
        
    }
    
}

}

Todos erramos, mas devemos sempre nos lembrar que = e == são duas coisas diferentes. = atribui valor a variavel e == compara. Exemplo:

int x = 0 //atribui o valor 0 a variavel x if(x == 0) //compara se o valor de x é igual a 0

e no lugar de ‘&’ o certo é ‘&&’

acho que o loop que você procura é algo do tipo:

    long x = 1; //você declarou essa variavel dentro do loop, então ela não existe para o sistema

    while(horasAtualVerao != hora && x == 0 ){ //enquanto horasAtualVerao for DIFERENTE de hora e x for igual a 0
     
    }

     //essas linhas abaixo estão FORA do loop(não sei se é sua intenção ou se foi um erro)
     if (horasAtualVerao == hora  || minutosAtual == minutos) { //se horasAtualVerao for igual hora OU minutosAtual for igual minutos
       System.out.println(agenda);
     
     }

me desculpe se eu entendi errado, mas se for, por favor explique com mais detalhes.

Não tenho certeza se o IF - ELSE deve ficar dentro do loop neste caso.

Na minha lógica (que nem sei se está correta), o programa deveria ficar em LOOP enquanto a hora e o minuto atual forem diferentes do informado pelo usuário e “sair do loop”, ou seja, executar o Syso(agenda) quando, e apenas SE a hora e o mínuto forem iguais aos informados.
A variável X foi criada apenas pra parar o programa quando o IF for executado, desta forma, eu escolho a HORA, o MINUTO e escrevo uma frase que será mostrada quando essa hora e minuto chegar na vida real, tipo um agendador de tarefas.

A principal dúvida além da sintaxe é se o While, If e Else estão com a lógica correta para a aplicação.

nesse caso acho que isso é o necessário:

while(true){ //vai rodar o loop infinitamente
 
  if (horasAtualVerao == hora  && minutosAtual == minutos) { //só printa agenda se hora e minuto obtidos for igual da sua variavel(executando esse if infinitamente)
    System.out.println(agenda);
    break; // sem o break vai printar agenda varias vezes durante um minuto inteiro

  }
}  

ou se você quiser interromper o loop em algum momento (caso não queira que seja infinito) pode fazer assim:

boolean qqrCoisa = true;

while(qqrCoisa == true){
 
  if (horasAtualVerao == hora  && minutosAtual == minutos) {
    System.out.println(agenda);
    break;
  }

  if(a condição que vc quiser para interromper o loop) {
    qqrCoisa = false;
  }
}

Utilizei a primeira opção, porém ele fica em loop pra sempre, não executa o if depois… nao sei se é algum problema com o IF ou com o while /=

se o if não foi executado é porque a condição não foi satisfeita.
coloca dentro do while mas fora do if um println com as quatro variáveis pra termos certeza que estão iguais:

while(true){ 

  println("horasAtualVerao = " + horasAtualVerao + "hora = " + hora + "minutosAtual = " + minutosAtual + "minutos = " + minutos );

  if (horasAtualVerao == hora  && minutosAtual == minutos) {
    System.out.println(agenda);
    break;

porque só vai entrar no if se as duas condições forem satisfeitas

Fiz alguns testes aqui.

Se eu colocar exatamente a hora real, no campo que o usuário escolhe a hora, e o mesmo para os minutos, o programa roda.

Acredito que o programa não esteja atualizando a hora real no método criado no começo.
Exemplo:

o programa vê o horario de acordo com a era Unix, e depois ele roda o while até que a hora UNIX que ele leu seja igual a criada pelo usuário, porém ele não atualiza essa hora unix constantemente, apenas na execução do programa.

Acredito que tenha que incluir o método pra verificar o horário dentro de um loop, procede ?

a hora e todas as outras variaveis são definidas corretamente no inicio do programa?

Sim, olha o programa:

package teste;

import java.util.Scanner;

public class Teste {

public static void main(String[] args) {

long totalMilisegundos = System.currentTimeMillis() - 10800000;

long totalSegundos = totalMilisegundos / 1000;
long segundosAtual = totalSegundos % 60;

long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;

long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;

System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);

    Scanner input = new Scanner(System.in);
    System.out.println("Digite a hora para despertar:");
    long hora = input.nextLong();
    
    System.out.println("Digite os minutos para despertar:");
    long minutos = input.nextLong();
    
    System.out.println("Digite a tarefa à agendar:");
    String agenda = input.next();
    
    System.out.println("Você configurou o despertador para " + hora + "h" + minutos
    + "m para realizar a tarefa: " + agenda + ".");
    
    
    
    
    while(true){
        
                
    if (horasAtualVerao == hora  || minutosAtual == minutos) {
    System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
    System.out.println("Tarefa: " + agenda + ".");
    break;
    }    
}    
}

}

Tenho quase certeza que o problema está no fato de que a hora está sendo gerada apenas no inicio do programa, e fica estática, o programa não lê de novo o método.

se for questão de estar sempre atualizando a hora, tente desse jeito:

package teste;

import java.util.Scanner;

public class Teste {

public static void main(String[] args) {

long totalMilisegundos;

long totalSegundos;
long segundosAtual;

long totalMinutos;
long minutosAtual;

long totalHoras;
long horasAtual;
long horasAtualVerao;

System.out.println("Horário Atual: " + horasAtualVerao + ":" + minutosAtual + ":" + segundosAtual);

    Scanner input = new Scanner(System.in);
    System.out.println("Digite a hora para despertar:");
    long hora = input.nextLong();
    
    System.out.println("Digite os minutos para despertar:");
    long minutos = input.nextLong();
    
    System.out.println("Digite a tarefa à agendar:");
    String agenda = input.next();
    
    System.out.println("Você configurou o despertador para " + hora + "h : " + minutos + "m para realizar a tarefa: " + agenda + ".");
    
    
    
    
    while(true){

      totalMilisegundos = System.currentTimeMillis() - 10800000;

      totalSegundos = totalMilisegundos / 1000;
      segundosAtual = totalSegundos % 60;

      totalMinutos = totalSegundos / 60;
      minutosAtual = totalMinutos % 60;

      totalHoras = totalMinutos / 60;
      horasAtual = totalHoras % 24;
      horasAtualVerao = horasAtual + 1;
                
    if (horasAtualVerao == hora  && minutosAtual == minutos) { // se vc usar || ele vai entrar mesmo que só 1 dsas condições seja verdadeira

    System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
    System.out.println("Tarefa: " + agenda + ".");
    break;
    }    
}    
}
}

Não funciona… ele finaliza o programa conforme abaixo:

Digite a hora para despertar:
17
Digite os minutos para despertar:
42
Digite a tarefa à agendar:
teste
Você configurou o despertador para 17h42m para realizar a tarefa: teste.
Você agendou a tarefa abaixo para 17h40m .
Tarefa: teste.

Por algum motivo agora o programa recebe a variável do usuário mas desconsidera ela.

Consegui, velho!

Fiz umas mudanças aqui, e ficou assim:

package teste;

import java.util.Scanner;

public class Teste {

public static void main(String[] args) {


Scanner input = new Scanner(System.in);
System.out.println("Digite a hora para despertar:");
long hora = input.nextLong();

System.out.println("Digite os minutos para despertar:");
long minutos = input.nextLong();

System.out.println("Digite a tarefa à agendar:");
String agenda = input.next();






while(true){
    
    long totalMilisegundos = System.currentTimeMillis() - 10800000;

    long totalSegundos = totalMilisegundos / 1000;
    long segundosAtual = totalSegundos % 60;

long totalMinutos = totalSegundos / 60;
long minutosAtual = totalMinutos % 60;

long totalHoras = totalMinutos / 60;
long horasAtual = totalHoras % 24;
long horasAtualVerao = horasAtual + 1;

    if (horasAtualVerao == hora  & minutosAtual == minutos) {
    System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m .");
    System.out.println("Tarefa: " + agenda + ".");
    break;
    }    
}    
}

}

Valeu pela ajuda!

Fico feliz em ajudar, eu executei aqui ficou legal, mas se vc quiser uma sugestão, só pra não parecer que o programa ficou parado, adicione um println dizendo que deu certo:

if (horasAtualVerao == hora  & minutosAtual == minutos) {
    System.out.println("Você agendou a tarefa abaixo para " + horasAtualVerao + "h" + minutosAtual +"m     .");
        System.out.println("Tarefa: " + agenda + ".");
        System.out.println("Tarefa agendada com sucesso, aguardando o momento para notificar...");
        break;
        }

e marque o topico como resolvido

O print “Você agendou a tarefa…” já tinha esse propósito, mas valeu a sugestão!

Vou resolver o tópico aqui, obrigado pela ajuda.

Só não achei onde resolver o tópico… é minha primeira participação aqui no GUJ