Java 局部变量未在TimerTask内使用

Java 局部变量未在TimerTask内使用,java,timertask,Java,Timertask,我每开始一个小时运行一次代码,但是下面这行代码没有执行 int lastcyclehour=hour; 我无法解释这是为什么。我得到的错误是“局部变量lastcyclehour的值为” “未使用”代码: 您正在声明两个同名的变量。排队 int lastcyclehour=0; int lastcyclehour=hour; 您可以声明一个永远不会更改的main方法的局部变量。请注意,当您希望从内部类访问它时,甚至禁止更改它 我同意你的说法 if(!(hour==lastcyclehour)

我每开始一个小时运行一次代码,但是下面这行代码没有执行

int lastcyclehour=hour;
我无法解释这是为什么。我得到的错误是“局部变量lastcyclehour的值为” “未使用”代码:


您正在声明两个同名的变量。排队

int lastcyclehour=0;
int lastcyclehour=hour;
您可以声明一个永远不会更改的
main
方法的局部变量。请注意,当您希望从内部类访问它时,甚至禁止更改它

我同意你的说法

if(!(hour==lastcyclehour)) {
将该常数与
小时
进行比较

排队

int lastcyclehour=0;
int lastcyclehour=hour;
在内部类的
run
方法中声明了另一个名为
lastcyclehour
的变量,该变量从未使用过,因此没有任何效果。若要为现有变量赋值,您不能声明它,即不指定类型,只需编写
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

您正在声明两个同名变量。排队

int lastcyclehour=0;
int lastcyclehour=hour;
您可以声明一个永远不会更改的
main
方法的局部变量。请注意,当您希望从内部类访问它时,甚至禁止更改它

我同意你的说法

if(!(hour==lastcyclehour)) {
将该常数与
小时
进行比较

排队

int lastcyclehour=0;
int lastcyclehour=hour;
在内部类的
run
方法中声明了另一个名为
lastcyclehour
的变量,该变量从未使用过,因此没有任何效果。若要为现有变量赋值,您不能声明它,即不指定类型,只需编写
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

在您的跑步方法中,尝试更改int lastcyclehour=hour;到lastcyclehour=小时;也就是说去掉“int”,你怎么知道int lastcyclehour=hour;这不是执行吗?您没有打印或使用它;到lastcyclehour=小时;也就是说去掉“int”,你怎么知道int lastcyclehour=hour;这不是执行吗?您没有打印或使用它。谢谢您的帮助。由于主要熟悉Matlab和VBA,不可变变量的概念对我来说相当陌生。您提供的这个答案仍然给了我“在封闭范围内定义的局部变量lastcyclehour必须是final或有效final”,而final int不是我想要的。我在答案中提供的代码不能让您得到这个错误。如果您遇到该错误,您的代码将不同。感谢您提供的有用答案。由于主要熟悉Matlab和VBA,不可变变量的概念对我来说相当陌生。您提供的这个答案仍然给了我“在封闭范围内定义的局部变量lastcyclehour必须是final或有效final”,而final int不是我想要的。我在答案中提供的代码不能让您得到这个错误。如果你得到了那个错误,你的代码是不同的。