Java 应用程序中的对象可以为空?

Java 应用程序中的对象可以为空?,java,android,android-activity,nullpointerexception,Java,Android,Android Activity,Nullpointerexception,在许多类(活动、片段、适配器等)中,我需要访问对象 所以我开始上应用课。(应用程序,用户) MainAppliction.java private static MainApplication singleton; public static MainApplication getApplication() { return singleton; } @Override public void onCreate() { super.onCreate(); single

在许多类(活动、片段、适配器等)中,我需要访问对象

所以我开始上应用课。(应用程序,用户)

MainAppliction.java

private static MainApplication singleton;

public static MainApplication getApplication() {
    return singleton;
}

@Override
public void onCreate() {
    super.onCreate();
    singleton = this;
}

private UserVo user; // I did not put null value
public UserVo getUser()(...)
public void setUser(UserVo user){...} // Called in LoginActivity
UserVo user;
@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    app = ((MainApplication) getApplicationContext());
    // or app = MainApplication.getApplication();
    user = app.getUser(); // Always Not Null
    //...
}

@Override
public void onResume() {
    user.getData(); // Sometimes NullPointerExeception By GC (Maybe?)
}
ActivityA.java、ActivityB.java、ActivityC.java

private static MainApplication singleton;

public static MainApplication getApplication() {
    return singleton;
}

@Override
public void onCreate() {
    super.onCreate();
    singleton = this;
}

private UserVo user; // I did not put null value
public UserVo getUser()(...)
public void setUser(UserVo user){...} // Called in LoginActivity
UserVo user;
@Override
public void onCreate(Bundle savedInstanceState) {
    //...
    app = ((MainApplication) getApplicationContext());
    // or app = MainApplication.getApplication();
    user = app.getUser(); // Always Not Null
    //...
}

@Override
public void onResume() {
    user.getData(); // Sometimes NullPointerExeception By GC (Maybe?)
}
如何防止空指针异常

我想有几个主意。但我不确定他们是否能解决

1。将Main应用程序中的UserVo用户更改为静态memeber

像这样(MainApplication.java)

2。调用getUser()不使用UserVo Memeber

像这样(Activity.java)

3。制作Inteface(它很复杂…我不想这样做)

像这样 (MainApplication.java)

(Activity.java)

请给我一些提示

如何防止空指针异常

简单

在构造函数中正确初始化所有对象,使它们100%准备好使用。不允许任何空引用

private static UserVo user;
如前所述,
user
null
。为什么?为什么是静态的?为什么不创建一个初始化为指向新的
UserVo
引用的私有数据成员


否则,在使用引用之前,必须在所有地方检查null。这是一种糟糕的样式,只会在处理过程中变得更糟。

另一种在处理后访问对象之前检查空值的方法。 事实上,检查空值并处理空值(通过java异常处理)总是一个好主意。此外,您还可以对变量/引用进行默认初始化,使对象上的方法调用不会产生副作用。 e、 g.如果是arrayList;声明一个类似List
abc=newarraylist()的变量
将为您创建一个空的arraylist。比如说,经过一些处理逻辑后,如果变量没有积累任何数据,它将保持为空;但不会抛出null指针异常

如何防止空指针异常

避免出现
NullPointerException
的最安全方法是在访问对象引用之前检查对象引用以确保它们不为null。 虽然这种方法可以确保您不会遇到意外的NullPointerException,但它也会使代码膨胀,使开发变得更加困难,影响代码的可读性,并且可能会在代码中隐藏最终需要处理的不需要的情况

更好的方法是首先避免这些空值。有很多方法可以做到这一点。举几个例子:

  • 检查方法参数是否为Null
  • 考虑基本体而不是对象
  • 仔细考虑链式方法调用< /LI>
  • 喜欢空的
  • 避免返回空值
  • 阻止传递空参数
本文很好地涵盖了这个主题。 我也推荐阅读(第二版)

有时通过GC执行NullPointerExeception(可能?)

如果某个对象具有来自另一个活动对象的强引用,则GC进程将不会收集该对象,因此不可能出现这种情况。更有可能的是,在调用
onResume
方法之前,
user
对象没有初始化

@Override
public void onResume() {
    MainApplication.getApplication().getUser(new OnUser() {
        void onUser(UserVo user) {
            //Do Work.
        }
    });
}
private static UserVo user;