简体   繁体   中英

Java System.currentTimeMillis() problem

So in my java class we have a homework assignment to use System.currentTimeMillis to display the amount of time between clicks. I've tried and tried but it isn't working. Here's my code.

 1 /* Matthew Caldwell
 2  * September 21, 2011
 3  * Homework #4: Problem 5.8.1 pg. 149
 4  * Program that displays the amount of time that passed
 5  * between two mouse clicks. Nothing is displayed
 6  * on the first click, then each successive click will 
 7  * display how much time passed between that click and 
 8  * the previous one. 
 9  */  
10  
11 import objectdraw.*; 
12 import java.awt.*; 
13  
14 public class ElapsedTimeClient extends WindowController { 
15    
16   public static void main(String[]args) { 
17     new ElapsedTimeClient().startController(800,500);
18   }
19 
20   private Text title,result;
21   private double count = 0;
22 
23   public void begin() {
24     
25     // Set up the title and result
26     title = new Text("CLICK COUNTER",
27                      canvas.getWidth() / 2,
28                      20, canvas);29     title.move(-title.getWidth() / 2, 0);
30     result = new Text("", canvas.getWidth() / 2, 40, canvas);
31 
32   }
33 
34   public void onMouseClick(Location p) {
35 
36     double timerS=0;
37 
38     if(count == 0) {
39       timerS = System.currentTimeMillis();
40     } else {
41       result.setText("The time between clicks was " +
42                      (System.currentTimeMillis() - timerS)/1000 +
43                      " seconds.");
44       timerS = System.currentTimeMillis();
45     }
46 
47     count++;
48 
49   } 
50  
51 }

I don't really want anyone to completely tell me how to do it but I just need a little guidance. What am I doing to make this wrong? The code all compiles and runs just fine but when I click instead of giving me the time that elapsed between clicks it's giving me a big long number that never changes. It's telling me 1.316639174817E9 almost every single time.

Firstly, system time in millis should be represented as a long, not a double.

Secondly, you need to make the variable that holds the time since the last click (timerS) an instance variable, it's currently method local and so reset every time.

In short, change:

double timerS=0;

from being a local variable, to an instance variable, and a long:

public class ElapsedTimeClient extends WindowController { 
long timerS;

the timerS variable is declared inside of the onMouseClick method, and thus only exists within this method. After your first mouse click, the variable disappears and can't be used to compare times.

Instead you should use a class variable to store this information in.

Your problems are:

  • timerS should be a field of the class (not a local variable) otherwise its value will not be held between calls to your method
  • timerS should be of type long - the type that's returned from the system time

Also:

  • count should be type int

In addition to the other answers mentioned, System.nanoTime is the preferred method for this type of measurement. Rather than measuring the difference in "clock time", this method measured the number of nanoseconds. You will often find that the resolution on currentTimeMilils is no better than around 16 ms, whereas nanoTime can resolve much smaller intervals.

You don't need double type for timerS. currentTimeMillis() returns long.

Why this happend? If you use double type like this:

(double - long) / 1000, 

this is interpreted on:

double / double = double 

So in the result you have "precise" value (eg 1.316639174817E9) instead of long one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM