【问题标题】:Arraylist returning null after trying to add items [duplicate]尝试添加项目后Arraylist返回null [重复]
【发布时间】:2017-07-17 10:42:17
【问题描述】:

已修复:更改为 .equals 而不是使用 ==。然后我将其更改为 subject.isEmpty() 并且效果也很好。为了记录,我的问题不是我如何比较字符串。这恰好是我的代码遇到的问题。感谢大家的回复!

我有一个 ArrayList,我从 sharedprefs 作为字符串加载并将其转换回 ArrayList。当我加载它时,我会检查它是否为空。如果它是空的,我会用 34 个对象填充它。然后我尝试使用 ArrayList 但我得到一个空对象引用。

我在 onCreate 之外声明我的变量

private ArrayList<Integer> subjects = new ArrayList<>();

当我运行这段代码时,我得到了错误

private void setupSubjects(){

    SharedPreferences sharedPrefs = this.getActivity().getSharedPreferences(viewPressed, Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String jsonString = new String();
    jsonString = sharedPrefs.getString("Subjects", jsonString);
    Type type = new TypeToken<ArrayList<Integer>>() {}.getType();
    subjects = gson.fromJson(jsonString, type);

    if(jsonString == ""){
        for(int i = 0; 33 < i; i++){
            subjects.add(0);
        }
    }

    if(subjects.get(0) == 1){
        questionsString = getResources().getStringArray(R.array.question);
        answersString = getResources().getStringArray(R.array.answer);
        questionsLoaded = new ArrayList<>(Arrays.asList(questionsString));
        answersLoaded = new ArrayList<>(Arrays.asList(answersString));
        randomizeSubjects();
    }

}

我得到一个 java.lang.NullPointerException: Attempt to call virtual method 'java.lang.Object java.util.ArrayList.get(int)' on an null object reference on this line

if(subjects.get(0) == 1){

【问题讨论】:

  • 你需要先学习一些java的基础知识... Fx 如何比较字符串
  • @Selvin 我不确定这是一个好的目标。 OP 显然在某处有一个空变量,但我们没有 minimal reproducible example
  • subjects 为空,因为它从未初始化过,因为缺乏 java 的基础知识(字符串比较)
  • @Selvin 为什么没有初始化? subjects = gson.fromJson(jsonString, type);
  • 因为 subjects = new ArrayList&lt;&gt;(); 在里面 if... Rest 是不相关的... 并且修复比较会修复 npe... 但不是整个代码

标签: android nullpointerexception gson sharedpreferences


【解决方案1】:

我认为你的问题在这里:

if(jsonString == ""){
    subjects = new ArrayList<>();
    for(int i = 0; 34 > i; i++){
        subjects.add(0);
    }
}

您正在再次初始化 ArrayList。你不需要这行subjects = new ArrayList&lt;&gt;();,因为你已经用private ArrayList&lt;Integer&gt; subjects = new ArrayList&lt;&gt;(); 声明了ArrayList。所以你应该能够做到:

//You also need to use .equals() method to compare strings
if(jsonString.equals("")){
    for(int i = 0; 34 > i; i++){
        subjects.add(0);
    }
}

但是,如果没有看到完整的代码,就很难说。

【讨论】:

  • 要补充这一点,您也不要使用== 来比较字符串。你应该使用jsonString.equals("")
  • 或者只是isEmpty()
  • 我再次重新初始化了 ArrayList,因为当我没有这样做时,它引发了错误。
  • 那么我需要查看您的所有代码。总的来说。出了点问题。
  • 将其更改为 jsonString.equals("") 有效。
【解决方案2】:

您正在一个空对象中调用 get 方法。在您的问题中,您没有指定运行该代码的时间点,但是您要么忘记在使用之前初始化 ArrayList subjects,要么为该变量分配了一个空对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多