0

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

所以我进入了应用程序类。(应用程序,用户)

主应用程序.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用户改为静态成员

像这样(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);
}

(活动.java)

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

请给我一些提示。

4

3 回答 3

0

如何防止空指针异常?

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

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

  • 检查 Null 的方法参数
  • 考虑基元而不是对象
  • 仔细考虑链式方法调用
  • 喜欢空项目而不是空项目
  • 避免返回空值
  • 不鼓励传递空参数

达斯汀马克思的这篇文很好地涵盖了这个主题。我还推荐阅读Effective Java (2nd Edition)。

有时由 GC 引发 NullPointerException(也许?)

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

于 2013-09-10T10:26:54.847 回答
0

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

于 2013-09-10T09:43:57.310 回答
0

如何防止空指针异常?

简单的。

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

private static UserVo user;

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

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

于 2013-09-10T09:39:11.130 回答