java - Observable.notifyObservers 空指针异常

标签 java android observable observer-pattern

我尝试在我的一个 Activity 中实现观察者模式,但在调用 notifyObservers 时遇到以下异常:

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

at java.util.Observable.notifyObservers(Observable.java:131)

at models.database.User.setPending(User.java:137)

我的实现非常简单:模型 User 是可观察的, Activity 是观察者(这无关紧要,因为永远不会到达 Activity 代码)。我的目标是在字段属性的每次更改时都收到通知。

这是 User 类中的相关部分:

public class User extends Observable implements Parcelable {

    private boolean pending;

    public void setPending(boolean pending) {
        synchronized (this) {
            this.pending = pending;
        }
        setChanged();
        notifyObservers(this);
    }
}

我的实现或我对这里的理解有什么缺陷吗?我不知道出了什么问题,我更愿意解决它而不是转向 RX 实现。

编辑:这是 MainActivity 代码,它永远不会到达:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Get session variables from previous activity (LoginActivity/SplashActivity)
    user = getIntent().getExtras().getParcelable(getString(R.string.e_user)); //Receiving user from previous activity, assured to be non-null

    //Add observer on user, so we'll be able to update drawer in case of modification
    user.addObserver(this);
}

@Override
public void update(Observable observable, Object o) {
    drawerBuilder.setUser(user);
}

最佳答案

我继续挖掘,发现我用来发出 HTTP 请求的库 Retrofit 根本不调用构造函数,而且到目前为止我没有遇到这个错误,因为我收到了 UserLoginActivity/SplashActivity 中,并使用 extras 将其传递给 MainActivity,从而使用 User(Parcel in) 构造函数(我唯一拥有的)。

User 类添加一个空的构造函数解决了这个问题。但是,我仍然不明白为什么 Retrofit 之前没有抛出任何异常。

关于java - Observable.notifyObservers 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367350/

相关文章:

Angular >= 2 - 服务监听另一个服务中的变化

typescript - Observable.interval 的问题 - 模板中的数据未更新,ngFor 的长度不正确,启动时获取轮询数据

java - 聊天应用程序问题

java - 捕获日期对象以进行进一步处理

Android:使用 OMXCodec 作为 MediaSource 时 MPEG4Writer 无法启动

android - 获取在线数据并将其存储在 Android 中的最佳方式

java - 如何在 Hibernate 中注解 Map<String, Set<String>> 或 Map<String, Map<String, String>>

java - hibernate 4处理唯一索引异常

java - Firebase 身份验证后启动新 Activity

java - 识别当前正在处理的元素