繁体   English   中英

Java System.currentTimeMillis()问题

[英]Java System.currentTimeMillis() problem

所以在我的java类中,我们有一个家庭作业,使用System.currentTimeMillis来显示点击之间的时间量。 我尝试过但尝试过但是没有用。 这是我的代码。

 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 }

我真的不想让任何人完全告诉我该怎么做但我只需要一些指导。 我做错了什么? 代码全部编译并运行得很好,但是当我点击而不是给我点击之间经过的时间时,它给了我一个永远不会改变的大数字。 它几乎每次都告诉我1.316639174817E9。

首先,以毫秒为单位的系统时间应表示为长,而不是双倍。

其次,你需要创建一个变量,它保存自上次单击(timerS)以来的时间实例变量,它当前是本地方法,因此每次都重置。

简而言之,改变:

double timerS=0;

从局部变量到实例变量和long:

public class ElapsedTimeClient extends WindowController { 
long timerS;

timerS变量在onMouseClick方法声明,因此只存在于此方法中。 第一次单击鼠标后,该变量消失,无法用于比较时间。

相反,您应该使用类变量来存储此信息。

你的问题是:

  • timerS应该是类的一个字段 (不是局部变量),否则它的值将不会在对方法的调用之间保持
  • timerS应为long类型 - 从系统时间返回的类型

也:

  • count应该是int类型

除了提到的其他答案之外, System.nanoTime是此类测量的首选方法。 该方法测量的是纳秒数,而不是测量“时钟时间”的差异。 您经常会发现currentTimeMilils的分辨率不会超过16 ms左右,而nanoTime可以解析更小的间隔。

timerS不需要double类型。 currentTimeMillis()返回long。

为什么会这样? 如果你使用这样的双重类型:

(double - long) / 1000, 

这被解释为:

double / double = double 

所以在结果中你有“精确”值(例如1.316639174817E9)而不是长值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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