静态变量失去了它的价值

时间:2011-01-15 08:24:35

标签: java static

我有一个带有这个静态变量的辅助类,用于在两个类之间传递数据。

public class Helper{
    public static  String paramDriveMod;//this is the static variable in first calss
}

此变量用于以下第二类mathod

    public void USB_HandleMessage(char []USB_RXBuffer){
    int type=USB_RXBuffer[2];
    MESSAGES ms=MESSAGES.values()[type];
    switch(ms){
        case READ_PARAMETER_VALUE:  // read parameter values
            switch(prm){
                case PARAMETER_DRIVE_MODE:  // paramet drive mode
                    Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));
                    System.out.println(Helper.paramDriveMod+"drive mode is selectd ");
                    //here it shows the value that I need...........
            }
    }
    //let say end switch and method
}

以下是第三类方法使用上面的类方法

public void buttonSwitch(int value) throws InterruptedException{
    boolean bool=true;
    int c=0;
    int delay=(int) Math.random();
    while(bool){
        int param=3;
        PARAMETERS prm=PARAMETERS.values()[param];
        switch(value){
            case 0: 
                value=1;
                while(c<5){
                    Thread.sleep(delay);                
                    protocol.onSending(3,prm.PARAMETER_DRIVE_MODE.ordinal(),dataToRead,dataToRead.length);//read drive mode
                    System.out.println(Helper.paramDriveMod+"  drive mode is ..........in wile loop");//here it shows null value
                }
                //break; ?
        }
    }
    //let say end switch and method
}

这个变量失去价值的原因是什么?

6 个答案:

答案 0 :(得分:1)

我可以建议在类之间传递数据,使用单独的对象而不是全局变量吗?

你完全不清楚如何期望protocolImpl中的代码被执行 - 正如templatetypedef所提到的,你没有在那个或param类中显示有效的Java代码(两者都没有遵循Java命名约定。)

一个简短但完整的例子确实会有所帮助,但总的来说,我建议你首先避免使用这种模式。考虑对象,而不是全局变量。

答案 1 :(得分:1)

据我了解,“类”(不只是一个实例,而是整个类对象)可以像任何其他未引用的对象一样进行垃圾收集 - 该类实例中的静态变量不会阻止GC收集你的班级。

我刚刚来到这里是因为我认为我在单身中看到这种行为,我想看看是否有其他人注意到它(我以前从未研究过这个问题 - 这个知识就像是十年之久在我的脑后,所以我不确定它在这一点上的可靠性)。

现在继续研究。

刚刚发现这个问题,请检查接受的答案 - 看起来不太可能因GC导致静电丢失,但可能。

Are static fields open for garbage collection?

答案 2 :(得分:0)

变量永远不会“失去”它的价值。你在某处将它设置为“null”,但是这里的代码不足以说明发生了什么。你设置它的唯一地方是这一行:

Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));

但是如果你将“null”传递给toString(),你会得到一些空指针异常...所以我会假设这行永远不会被命中,所以你得到“null”值,因为你没有用其他一些初始化paramDriveMod值。

答案 3 :(得分:0)

在处于某种危急情况之前,请勿使用静态变量。您可以使用getter setter

答案 4 :(得分:0)

可能是因为staticfinal混淆了吗?静态变量的值可以改变。最终变量的值不能。

答案 5 :(得分:-1)

未显示执行流程 - 可能是第3个代码:

while(c<5){
    Thread.sleep(delay);                
    protocol.onSending(3,prm.PARAMETER_DRIVE_MODE.ordinal(),dataToRead,dataToRead.length);//read drive mode
    System.out.println(Helper.paramDriveMod+"  drive mode is ..........in wile loop");//here it shows null value  "

在第二个代码

之前执行
switch(ms)
{
    case READ_PARAMETER_VALUE:  // read parameter values
        switch(prm){
            case PARAMETER_DRIVE_MODE:  // paramet drive mode
                Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));