TimerTask中没有使用局部变量

时间:2015-11-05 14:17:22

标签: java timertask

我每隔一小时开始运行一次代码,但不执行以下行

int lastcyclehour=hour;

我无法解决为什么会这样。我得到的错误是“局部变量lastcyclehour的值是      没用过“代码:

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class ControlStarter {

    public static void main(String[] args) {

        //TIMER, runs the code immediately once in the beginning of each hour
        int lastcyclehour=0;
        Timer timer = new Timer();  
        TimerTask tt = new TimerTask(){
            public void run(){
                Calendar cal = Calendar.getInstance(); //read Calendar
                int hour = cal.get(Calendar.HOUR_OF_DAY);//get the hour
                if(!(hour==lastcyclehour)) {

                    //code
                    System.out.println(hour);
                    System.out.println(lastcyclehour);

                    //code
                }

                int lastcyclehour=hour;     
            }
        };
        timer.schedule(tt, 1000, 1000*2);// 
    }
}

1 个答案:

答案 0 :(得分:0)

您正在声明两个同名变量。用线

int lastcyclehour=0;

您声明了main方法的局部变量,该变量永远不会更改。请注意,当您想从内部类访问它时,甚至禁止更改它。

声明

if(!(hour==lastcyclehour)) {

您将该常数与hour进行比较。

使用

int lastcyclehour=hour;

您在内部类的lastcyclehour方法中声明了另一个名为run的变量,这是您从未使用过的,因此它没有任何效果。要为现有变量赋值,不得声明它,即不指定类型,只需写lastcyclehour=hour;即可。但如上所述,您无法从内部类修改周围方法的局部变量。要创建一个可变变量来记住它在run()方法的不同调用之间的值,你必须将它声明为内部类的实例变量:

public static void main(String[] args) {
    //TIMER, runs the code immediately once in the beginning of each hour
    Timer timer = new Timer();  
    TimerTask tt = new TimerTask() {
        int lastcyclehour = 0;
        public void run() {
            Calendar cal = Calendar.getInstance(); //read Calendar
            int hour = cal.get(Calendar.HOUR_OF_DAY);//get the hour
            if(hour!=lastcyclehour) {

                //code
                System.out.println(hour);
                System.out.println(lastcyclehour);

                //code
                lastcyclehour=hour;     
            }
        }
    };
    timer.schedule(tt, 1000, 1000*2);// 
}

进一步注意,赋值lastcyclehour=hour必须位于if语句的条件代码中,以确保将当前小时与执行操作的最后一小时进行比较。

此外,条件! (a == b)可以简化为a != b