2016-11-30 46 views
0

试图在业余时间用java制作一个时钟,有很多乐趣和两个小时,但我仍然遇到了我的代码问题。Java时钟太快

它告诉我当前时间,但进展太快。

(复制并粘贴到一个IDE /编译并运行它,你会看到)

谁能帮助初学者?

package clock; 

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Clock { 


    public static void main(String[] args) { 

     int hour; 
     int minute; 
     int second; 
     Scanner keyb = new Scanner(System.in); 


     System.out.println("What hour is it?"); 
     hour = keyb.nextInt(); 
     System.out.println("What Minute is it?"); 
     minute = keyb.nextInt(); 
     second = 0; 
     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      Scanner keyb = new Scanner(System.in); 
      int hour; 
      int minute; 
      int second; 
      int turnOn; 
      @Override 
      public void run() { 
       turnOn = 1; 
       while (turnOn != 0){ 
        System.out.println("Current time is:"+ hour +":"+minute+":"+second); 
        second ++; 
        if (second >= 59){ 
         minute ++; 
         second = 0; 
        } 
        else{ 

        } 
        if (minute >= 59){ 
         hour ++; 
         minute = 0; 
        } 
        else{ 

        } 
        if (hour >= 24){ 
         hour = 0; 
        } 

       } 
      } 

     }, 0, 1000); 
    } 

} 
+1

将停止while循环一直持续到下一秒为什么不使用'turnOn'一个'boolean'后改变所述开启INT为0解决了这个? – JonK

+0

嗨好主意,只是改变了! –

回答

0

有各种各样的事情要考虑: (1)等待每圈1秒后。 (忽略循环中的处理时间) (2)在'else if'块中放置分钟和小时逻辑。 像这样

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.util.concurrent.TimeUnit; 

public class Clock { 

    public static void main(String[] args) { 

     int hour; 
     int minute; 
     int second; 
     Scanner keyb = new Scanner(System.in); 

     System.out.println("What hour is it?"); 
     hour = keyb.nextInt(); 
     System.out.println("What Minute is it?"); 
     minute = keyb.nextInt(); 
     second = 0; 
     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      Scanner keyb = new Scanner(System.in); 
      int hour; 
      int minute; 
      int second; 
      int turnOn; 

      @Override 
      public void run() { 
       turnOn = 1; 
       while (turnOn != 0) { 
        System.out.println("Current time is:" + hour + ":" + minute 
          + ":" + second); 
        second++; 
        if (second >= 59) { 
         minute++; 
         second = 0; 
         if (minute >= 59) { 
          hour++; 
          minute = 0; 
          if (hour >= 24) { 
           hour = 0; 
          } 
         } 
        } 
        try { 
         TimeUnit.SECONDS.sleep(1); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     }, 0, 1000); 
    } 
} 
+0

不',0,1000)'每次它之间设置为1秒? –

+0

它的确如此。这不是重点。查看我的答案以获得解释。 – xenteros

+0

好吧,运行它,看看输出说是否比评论更强: – ManishKr

1

您已安排你的无限循环开始每一秒。 t.schedule(TimerTask, long, long)正确地从0开始,但是然后每秒运行您的运行方法。如果您在方法run的每次调用中增加秒数,这将是正确的。不幸的是,不是递增一次,而是开始每次执行都会增加的无限循环。

Timer t = new Timer(); 
    t.schedule(new TimerTask() { 
     Scanner keyb = new Scanner(System.in); 
     int hour; 
     int minute; 
     int second; 
     boolean turnOn = true; 
     @Override 
     public void run() { 
//CHANGE HERE!!! \/ 
//You only want to increment seconds once in a call of run method. 
      if (turnOn){ 
       System.out.println("Current time is:"+ hour +":"+minute+":"+second); 
       second ++; 
       if (second >= 59){ 
        minute ++; 
        second = 0; 
       } 
       if (minute >= 59){ 
        hour ++; 
        minute = 0; 
       } 
       if (hour >= 24){ 
        hour = 0; 
       } 
      } 
     } 

    }, 0, 1000); 

是你在找什么。

作为一个方面的备注请记住,空的else块是冗余以及空行。你的代码中不需要它们。更何况在StackOverflow上发布它们是不合适的。你的例子应该是最小的。

+0

turnOn = 1?,turnOn是​​布尔值 – ManishKr

+0

@Manish没有看到。事实并非如此 – xenteros

-1

我已经while循环,当它重置为1

+1

检查我的答案。每次只能运行一次循环。这不是什么循环。 – xenteros