2011-01-15 11 views
0

Ich habe Helper-Klasse mit dieser statischen Variable, die für die Weitergabe von Daten zwischen zwei Klassen verwendet wird.statische Variable verliert ihren Wert

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

diese Variablen in folgenden zweite Klasse verwendet werden 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 
} 

und das folgende ist eine dritte Klasse-Methode die obige Klassenmethode verwendet

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 
} 

was dass dieser Variable der Grund ist, seinen Wert verlieren?

+7

Dies ist kein gültiger Java-Code; Kannst du es bitte reparieren, um die richtigen Methoden zu haben? – templatetypedef

+0

Wenn du sagst verlieren; Wird paramDriveMod '0' oder leer? – trojanfoe

+0

Es zeigt Nullwert – user542719

Antwort

1

Könnte ich vorschlagen, dass Sie zum Übergeben von Daten zwischen Klassen separate Objekte anstelle einer globalen Variablen verwenden?

Es ist nicht klar, wie Sie den Code in protocolImpl erwarten ausgeführt werden - wie templatetypedef erwähnt, Sie haben in entweder das oder die param Klasse nicht gültig Java-Code angezeigt (von denen keiner Java Namenskonventionen folgt).

Ein kurzes aber vollständiges Beispiel würde wirklich helfen, aber im Allgemeinen würde ich vorschlagen, dass Sie vermeiden, dieses Muster an erster Stelle zu verwenden. Denken Sie an Objekte, nicht an globale Variablen.

0

Eine Variable verliert niemals ihren Wert. Sie setzen es irgendwo auf "null", aber Ihr Code hier ist nicht genug, um zu sagen, was los ist. Der einzige Ort, hier, wo Sie es festgelegt ist diese Zeile:

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

Aber wenn Sie „null“ zu toString() Sie einige Null-Zeiger Ausnahme erhalten passieren ... so würde ich davon ausgehen, dass diese Linie wird nie getroffen und Sie erhalten also den Wert "null", da Sie paramDriveMod nicht mit einem anderen Wert initialisieren.

+0

Helper.paramDriveMod = (Integer.toString (((USB_RXBuffer [4] << 8) & 0xff00))); // hier, wenn den Wert drucken ist es in Ordnung, aber wenn ich es an andere Klasse übergeben zeigt es Null Wert in anderer Klasse. – user542719

0

Verwenden Sie keine statische Variable, bis Sie sich in einer kritischen Situation befinden. Sie können stattdessen Getter Setter verwenden

+0

Ich habe versucht, geter und setter, aber das gleiche Ergebnis wie statische – user542719

0

Könnte es sein, dass Sie static mit final verwirren können? Die Werte von statischen Variablen können sich ändern. Die Werte der letzten Variablen können nicht.

+0

nein nein Ich muss statische Variable verschiedene Werte zuweisen nicht als endgültig zu initialisieren. – user542719

-1

Die Ausführung gezeigt Strömung nicht - der dritte Code sein kann:

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 " 

vor dem zweiten Code ausgeführt wird

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))); 
1

Wie ich es verstehe, eine „Klasse“ (Nicht nur eine Instanz aber das gesamte Klassenobjekt) Kann Garbage Collection genauso wie jedes andere nicht referenzierte Objekt sein - eine statische Variable in dieser Klasseninstanz verhindert nicht, dass der GC Ihre Klasse sammelt.

Ich kam gerade hierher, weil ich denke, dass ich dieses Verhalten in einem Singleton sehe und ich wollte sehen, ob es jemand anderes bemerkt hat (ich musste das Problem nie vorher erforschen - und dieses Wissen ist wie ein Jahrzehnt alt von meinem Hinterkopf, so bin ich mir dessen Zuverlässigkeit zu diesem Zeitpunkt nicht sicher).

Gehen Sie weiter Forschung jetzt zu gehen.

Gerade diese Frage gefunden, überprüfen Sie die akzeptierte Antwort - sieht aus wie es unwahrscheinlich ist, dass eine statische wird wegen GC verloren gehen, aber möglich.

Are static fields open for garbage collection?

Verwandte Themen