2011-11-02 255 views
1

我正在開發Android項目。我有一些靜態字段。我使用靜態塊從另一個類初始化這些字段。但是,當程序中稍後訪問靜態字段時,字段中設置的值將丟失。Android:靜態字段的值在靜態塊中設置一次後會丟失

請參閱下面的兩個類:

public class Constants { 
    static { 
     String TAG = "Credentials"; 
     Log.d(TAG, "Inside static block"); 
     Logger.setCredentials(tempUserId, tempPasswd); 
     Log.d(TAG, "Inside static block : Logger.userId : " + 
       Logger.userId + " : Logger.password : " + Logger.password); 
     new Logger("Test"); 
     Log.d(TAG, "Inside static block : After creatinf object : Logger.userId : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 

    } 
} 

public class Logger { 
    public static String userId; 
    public static String password; 

    public static void setCredentials(String userId, String password) { 
     Logger.userId = userId; 
     Logger.password = password; 
     Log.d("Credentials","Inside setCredentials : Logger.userId : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 
    } 

    public Logger(String tag) { 
     super(); 
     Log.d("Credentials","Inside constructor : Logger.userid : " + 
      Logger.userId + " : Logger.password : " + Logger.password); 
     if (Logger.userId == null || Logger.password == null) { 
      throw new NullPointerException(); 
     } else { 
     } 
    } 
} 

程序輸出:

內的靜塊

內setCredentials方法:Logger.userId:testuser的:Logger.password:abc.123

內部靜態塊:Logger.userId:testuser:Logger.password:abc.123

內部構造:Logger.userid:TESTUSER:Logger.password:abc.123

內部靜塊:後creatinf對象:Logger.userId:TESTUSER:Logger.password: abc.123

內部構造:Logger.userid:空:Logger.password:當作爲一個Java應用程序運行空

顯示java.lang.NullPointerException

的代碼工作正常。在android中運行時,字段值會丟失。請提出發生了什麼問題?

還有一件事,如果在代碼中處理異常,那麼在異常處理後再次調用靜態塊。

+0

你的控制流程非常尷尬 - 它應該被簡化。我在哪裏得到tempuser/tempPassword?他們只是常數 - 爲什麼不讓記錄器域最終? –

+0

您無法確定您的類是以何種順序加載的,因此,它們的* static *代碼的執行順序如何。所以不要依賴一個類的靜態代碼來初始化另一個類的字段! – JimmyB

+0

tempuser/tempPassword從應用程序啓動時僅從數據庫中提取一次。記錄器類將用於開發更多的應用程序。所以我在應用程序啓動時動態初始化其靜態字段。如果我使這些字段最終並在Logger類中初始化它們,我將不得不在每個應用程序中修改這些字段。 – sagarpdesai

回答

0

這可能不是你現在的問題,但請考慮一下,Android不會對你的進程生存期(以及你的靜態變量)持有多少控制權。 Android可以自由地殺死你的進程(如果你的應用程序暫停)並在以後重新創建它。在需要和適當的情況下,您有責任保存州。