【问题标题】:Object in Application can be null?应用程序中的对象可以为空吗?
【发布时间】:2013-09-10 09:33:18
【问题描述】:

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

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

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 用户更改为静态成员

像这样(MainApplication.java)

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

2。调用 getUser() 不使用 UserVo 成员

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

请给我一些建议。

【问题讨论】:

    标签: java android android-activity nullpointerexception


    【解决方案1】:

    如何防止空指针异常?

    简单。

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

    private static UserVo user;
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如何防止空指针异常?

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

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

        • 检查 Null 的方法参数
        • 考虑基元而不是对象
        • 仔细考虑链式方法调用
        • 优先使用 empty items 而不是 null
        • 避免返回空值
        • 不鼓励传递空参数

        Dustin Marxblog post 很好地涵盖了这个主题。 我也推荐阅读Effective Java(第二版)。

        GC 有时会出现 NullPointerException(可能?)

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多