0

在我的活动中,我有一个在 onCreate() 期间初始化的培训对象成员。该对象的所有成员均已设置。

private Training mTraining;是班级成员

public class Training extends BaseModel {

    ...

    @SerializedName("state")
    public TrainingState state;

    ....

    public TrainingPreview() {
    }

这个对象是从服务器(JSON)得到的,我在这个状态上有一个转换器来确保这个枚举不能为空(我使用 GSON 引擎):

public class TrainingStateConverter extends EnumConverter<TrainingState> {

    public static final Type TYPE = new TypeToken<TrainingState>() {}.getType();

    @Override
    protected TrainingState deserialize(String value) {
        return TrainingState.fromString(value);
    }

    @Override
    protected TrainingState getUnknownValue() {
        return TrainingState.UNKNOWN;
    }
}

在设置过程中,我创建了带有监听器的练习列表以显示特定练习:

private void refreshExercisesList() {
        final Runnable showTrainingParts = new Runnable() {
            public void run() {
                int nbItems = mCardExercises.setExercises(mTraining.training, mTraining.state,
                        new FlatCardTrainingProfilePartExercisesView.OnClickExerciseListener() {
                            @Override
                            public void showPart(String trainingPartId, int index) {
                                onClickOnExercisesList(trainingPartId, index);
                            }
                        });
            }
        };
    }
   ...
}

我的 onClickOnExercisesList() 方法:

private void onClickOnExercisesList(String trainingPartId, int index) {
        ...

            switch (mTraining.state) {
                ...

几个月以来,此活动代码运行良好,但昨天出现 NullPointerException switch (mTraining.state)

int com.xxx.model.training.TrainingState.ordinal()' on a null object reference
com.xxx.ui.training.TrainingActivity.onClickOnExercisesList

伙计们怎么可能?

非常感谢您的帮助!

4

1 回答 1

0

如果state没有出现在 JSON 中,就会发生这种情况。

TypeConverter仅在 JSON 中有要转换的值时使用。如果该值不存在,则没有要转换的内容,因此该值是默认值,即 null,因为您没有设置它:

    @SerializedName("state")
    public TrainingState state;

要解决此问题,请将变量初始化为默认值:

    @SerializedName("state")
    public TrainingState state = TrainingState.UNKNOWN;
于 2021-05-17T20:28:05.280 回答