[英]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.