[英]Attempt to invoke virtual method on a null object reference - Global Variables Class
我正在學習MVC。 我的項目有很多變量。 因此,我為他們創建了一個名為MainVariables的新類。
public class MainVariables {
private String mPictureDirectory;
private String mNameOfThePictureFile;
private String mFullPathPicture;
private double mLongitude;
private double mLatitude;
private String mAddress;
private String mCity;
private String mState;
private String mCountry;
private String mPostalCode;
private String mKnownName;
private String mDescription;
private String mSolicitationType;
...
...
其余部分由每個變量的自動獲取器和設置器組成。
我在應用程序中訪問和強制轉換這些變量時遇到問題。
我嘗試通過在其他文件中投射以下內容來訪問它:
private MainVariables mMainVariables;
上面的代碼引發錯誤Attempt to invoke virtual method on a null object reference
然后我嘗試了以下方法:
private MainVariables mMainVariables = new MainVariables();
現在,這確實可行。 不過,僅在文件中使用。 例如,我在“ SolicitationFragment”中設置變量,當我嘗試在“ PostFragment”上訪問它時,得到的結果為空。
那是因為我必須在每個文件上初始化MainVariables。
如何解決這個問題並能夠全局訪問變量?
將變量設為靜態,如果不打算對其進行更改,則為final。 這樣,您無需創建新實例,即可立即調用MainVariables.mPictureDirectory
public class MainVariables {
public static String mPictureDirectory;
}
另一種選擇是單例模式,通過這種方式,您只能創建一個對象的實例,並且仍然可以使用getter和setter
public class MainVariables {
private static MainVariables mInstance = null;
private String mString;
private MainVariables(){
mString = "Hello";
}
public static MainVariables getInstance(){
if(mInstance == null)
{
synchronized (MainVariables.class) {
if (mInstance== null) {
mInstance= new MainVariables();
}
}
return mInstance;
}
public String getString(){
return this.mString;
}
public void setString(String value){
mString = value;
}
}
在您的MainActivity中,您可以聲明一個字段
MainVariables mainVariables = MainVariables.getInstance()
並打電話
mainVariables.[METHOD]
基本上來自MainActivity中的任何位置
創建一個擴展Application
類的類,並創建一個方法來獲取MainVariables
實例:
AppController.java
public class AppController extends Application {
private MainVariables mMainVariables;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public MainVariables getMainVariables() {
if (mMainVariables == null) {
mMainVariables = new MainVariables();
}
return mMainVariables;
}
}
MainVariables.java
public class MainVariables {
private String string;
public String getString(){
return this.string;
}
public void setString(String string){
this.string = string;
}
}
采用:
// SET VALUE
AppController.getInstance().getMainVariables().setString("Hello Android");
// GET VALUE
String str = AppController.getInstance().getMainVariables().getString();
僅供參考,您必須在AndroidManifest.xml
文件的application
名稱下添加AppController
類。
<application
android:name=".AppController">
</application>
希望這會有所幫助〜
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.