簡體   English   中英

嘗試在空對象引用上調用虛擬方法-全局變量類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM