2016-11-30 1 views
0

Ich versuche in meiner Freizeit eine Uhr in Java zu machen, mit viel Spaß und zwei Stunden in der Zeit bekomme ich immer noch Probleme mit meinem Code.Java Clock zu schnell

es sagt mir die aktuelle Zeit aber Fortschritte viel zu schnell.

(kopieren und in einem IDE/Compiler einfügen und ausführen und Sie werden sehen)

Kann mir jemand einen Anfänger helfen?

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

setzt Warum nicht eine 'boolean' für' turnOn' verwenden ? – JonK

+0

Hallo gute Idee, änderte es einfach! –

Antwort

0

Es gibt verschiedene Dinge zu beachten: (1) für 1 Sekunde warten nach jeder Schleife. (Ignorieren der Verarbeitungszeit in der Schleife) (2) Setzen Sie die Minuten- und Stundenlogik in 'else if' block. So etwas wie dieses

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

nicht ', 0, 1000)' es jedes Mal auf 1 Sekunde setzen, wenn es das tut? –

+0

Es tut. Es ist nicht der Punkt. Überprüfen Sie meine Antwort für eine Erklärung. – xenteros

+0

Nun, führen Sie es und sehen, ob die Ausgabe sagt stärker als Kommentare :) – ManishKr

1

Sie haben die Endlos-Schleife geplant jede Sekunde gestartet werden. t.schedule(TimerTask, long, long) beginnt bei 0 richtig, aber führt dann Ihre Laufmethode jede Sekunde aus. Es wäre korrekt, wenn Sie bei jedem Aufruf der Methode run die Sekunde inkrementiert hätten. Leider, anstatt einmal zu inkrementieren, starten Sie eine Endlosschleife, die bei jeder Ausführung inkrementiert wird.

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); 

Ist das, was Sie suchen.

Als Nebenbemerkung bitte beachten Sie, dass leere else Blöcke sowohl redundante als auch leere Zeilen sind. Sie brauchen sie nicht in Ihrem Code. Außerdem ist es unangemessen, sie auf StackOverflow zu posten. Ihr Beispiel sollte minimal sein.

+0

turnOn = 1 ?, turnOn ist boolean – ManishKr

+0

@Manish hat das nicht gesehen. Es war nicht der Fall tatsächlich – xenteros

-1

Ich habe dieses Problem behoben, indem die TurnOn int 0 nach der while-Schleife zu ändern, die die while-Schleife bis zur nächsten Sekunde fort stoppt, wenn es auf 1

+1

Überprüfen Sie meine Antwort. Sie sollten Ihre Schleife nicht immer nur einmal ausführen. Es ist nicht wofür Schleifen sind. – xenteros