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