我有一个带有这个静态变量的辅助类,用于在两个类之间传递数据。
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
}
这个变量失去价值的原因是什么?
答案 0 :(得分:1)
我可以建议在类之间传递数据,使用单独的对象而不是全局变量吗?
你完全不清楚如何期望protocolImpl
中的代码被执行 - 正如templatetypedef所提到的,你没有在那个或param
类中显示有效的Java代码(两者都没有遵循Java命名约定。)
一个简短但完整的例子确实会有所帮助,但总的来说,我建议你首先避免使用这种模式。考虑对象,而不是全局变量。
答案 1 :(得分:1)
据我了解,“类”(不只是一个实例,而是整个类对象)可以像任何其他未引用的对象一样进行垃圾收集 - 该类实例中的静态变量不会阻止GC收集你的班级。
我刚刚来到这里是因为我认为我在单身中看到这种行为,我想看看是否有其他人注意到它(我以前从未研究过这个问题 - 这个知识就像是十年之久在我的脑后,所以我不确定它在这一点上的可靠性)。
现在继续研究。
刚刚发现这个问题,请检查接受的答案 - 看起来不太可能因GC导致静电丢失,但可能。
答案 2 :(得分:0)
变量永远不会“失去”它的价值。你在某处将它设置为“null”,但是这里的代码不足以说明发生了什么。你设置它的唯一地方是这一行:
Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));
但是如果你将“null”传递给toString(),你会得到一些空指针异常...所以我会假设这行永远不会被命中,所以你得到“null”值,因为你没有用其他一些初始化paramDriveMod值。
答案 3 :(得分:0)
在处于某种危急情况之前,请勿使用静态变量。您可以使用getter setter
答案 4 :(得分:0)
可能是因为static
与final
混淆了吗?静态变量的值可以改变。最终变量的值不能。
答案 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)));