Application中的对象可以为null吗?

时间:2013-09-10 09:33:18

标签: java android android-activity nullpointerexception

在许多类(Activity,Fragment,Adapter,...)中,我需要访问对象。

所以我把它放到Application类中。 (app,user)

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

ActivityA.java,ActivityB.java,ActivityC.java

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。将MainApplication中的UserVo用户更改为Static memeber

像这样(MainApplication.java)

private static UserVo user;
public static UserVo getUser()(...)

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

像这样(Activity.java)

@Override
public void onResume() {
    MainApplication.getApplication().getUser().getData();
}

第3。使界面(这很复杂......我不想这样做)

喜欢这个 (MainApplication.java)

interface OnUser {
    void onUser(UserVo user);
}
public void getUser(OnUser onUser) {
    if (user == null)
        // Start Login Activity, and receive UserVo from Server.
    else
        onUser.onUser(user);
}

(Activity.java)

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

请给我一些提示。

3 个答案:

答案 0 :(得分:0)

  

如何防止空指针异常?

易。

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

private static UserVo user;

正如所写,usernull。为什么?静电为什么?为什么不初始化的私有数据成员指向创建时的新UserVo引用?

否则,在使用引用之前,必须在任何地方检查null。这是一种糟糕的风格,只会随着你的情况变得更糟。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

如何防止空指针异常?

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

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

  • 检查Null的方法参数
  • 考虑原始而不是对象
  • 仔细考虑链式方法调用
  • 首选empty items为空
  • 避免返回空缺
  • 阻止传递空参数

blog post Dustin Marx很好地涵盖了这个主题。 我还建议阅读Effective Java(第2版)。

  

有时NullPointerExeception由GC(可能?)

如果某个对象具有来自其他活动对象的强引用,则该进程不会收集该对象,因此无法使用此方案。更有可能的是user对象在调用onResume方法之前未初始化。