我正在開發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中運行時,字段值會丟失。請提出發生了什麼問題?
還有一件事,如果在代碼中處理異常,那麼在異常處理後再次調用靜態塊。
你的控制流程非常尷尬 - 它應該被簡化。我在哪裏得到tempuser/tempPassword?他們只是常數 - 爲什麼不讓記錄器域最終? –
您無法確定您的類是以何種順序加載的,因此,它們的* static *代碼的執行順序如何。所以不要依賴一個類的靜態代碼來初始化另一個類的字段! – JimmyB
tempuser/tempPassword從應用程序啓動時僅從數據庫中提取一次。記錄器類將用於開發更多的應用程序。所以我在應用程序啓動時動態初始化其靜態字段。如果我使這些字段最終並在Logger類中初始化它們,我將不得不在每個應用程序中修改這些字段。 – sagarpdesai