简体   繁体   English

尝试在空对象引用上调用虚拟方法-全局变量类

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

I'm learning about MVC. 我正在学习MVC。 My project has tons of variables. 我的项目有很多变量。 So I made a new class for them called MainVariables. 因此,我为他们创建了一个名为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 上面的代码引发错误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. 例如,我在“ SolicitationFragment”中设置变量,当我尝试在“ PostFragment”上访问它时,得到的结果为空。

That's because I'm having to initialize MainVariables on each file. 那是因为我必须在每个文件上初始化MainVariables。

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. 将变量设为静态,如果不打算对其进行更改,则为final。 This way you don't have to create a new instance and can call MainVariables.mPictureDirectory immediately 这样,您无需创建新实例,即可立即调用MainVariables.mPictureDirectory

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 另一种选择是单例模式,通过这种方式,您只能创建一个对象的实例,并且仍然可以使用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;
    }
}

In your MainActivity you can declare a field 在您的MainActivity中,您可以声明一个字段
MainVariables mainVariables = MainVariables.getInstance()
and call 并打电话
mainVariables.[METHOD] from basically anywhere in your MainActivity mainVariables.[METHOD]基本上来自MainActivity中的任何位置

Create a class extending your Application class and create a method to get instance of MainVariables : 创建一个扩展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;
    }
}

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. 仅供参考,您必须在AndroidManifest.xml文件的application名称下添加AppController类。

<application
    android:name=".AppController">

</application>

Hope this will help~ 希望这会有所帮助〜

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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