简体   繁体   中英

Attempt to invoke virtual method on a null object reference - Global Variables Class

I'm learning about MVC. My project has tons of variables. So I made a new class for them called 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;
...
...

The rest is composed by automatic getters and setters for each variable.

I'm having a problem accessing and casting those variables across my application.

I tried accessing it by casting the following in other files:

private MainVariables mMainVariables;

The above code throws the error Attempt to invoke virtual method on a null object reference

Then I tried the following:

private MainVariables mMainVariables = new MainVariables();

Now, this does work. Only in the file it's using though. For Example, I set variables from within the "SolicitationFragment" and when I try to access it on "PostFragment", I get an empty result.

That's because I'm having to initialize MainVariables on each file.

How can I get around this and be able to access my variables globally?

Make the variables static, or final if you're not going to change them. This way you don't have to create a new instance and can call MainVariables.mPictureDirectory immediately

public class MainVariables {
    public static String mPictureDirectory;
}

Another option is a singleton pattern, this way you create only one instance of an object and still can use getters and setters

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;
    }
}

In your MainActivity you can declare a field
MainVariables mainVariables = MainVariables.getInstance()
and call
mainVariables.[METHOD] from basically anywhere in your MainActivity

Create a class extending your Application class and create a method to get instance of 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;
    }
}

USE:

// SET VALUE
AppController.getInstance().getMainVariables().setString("Hello Android");

// GET VALUE
String str = AppController.getInstance().getMainVariables().getString();

FYI, You have to add AppController class under application name in your AndroidManifest.xml file.

<application
    android:name=".AppController">

</application>

Hope this will help~

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM