修正:更改为.equals而不是使用==。然后我将它改为subjects.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:尝试在此行的空对象引用上调用虚方法'java.lang.Object java.util.ArrayList.get(int)'
if(subjects.get(0) == 1){
答案 0 :(得分:0)
我认为你的问题在这里:
if(jsonString == ""){
subjects = new ArrayList<>();
for(int i = 0; 34 > i; i++){
subjects.add(0);
}
}
您正在再次初始化ArrayList。您不需要此行subjects = new ArrayList<>();
,因为您已使用private ArrayList<Integer> subjects = new ArrayList<>();
声明了ArrayList。所以你应该能够做到:
//You also need to use .equals() method to compare strings
if(jsonString.equals("")){
for(int i = 0; 34 > i; i++){
subjects.add(0);
}
}
但是,如果不完整地看到代码,很难说。
答案 1 :(得分:0)
您在null对象中调用 get 方法。在您的问题中,您没有指定运行该代码的位置,但是您在使用它之前忘记初始化ArrayList 主题,或者您为该变量分配了一个空对象。