java.lang.IndexOutOfBoundsException:从firebase服务器获取数据时索引:0,大小:0
Posted
技术标签:
【中文标题】java.lang.IndexOutOfBoundsException:从firebase服务器获取数据时索引:0,大小:0【英文标题】:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 when getting data from firebase server 【发布时间】:2021-12-13 00:48:28 【问题描述】:我在创建一个可以与 firebase 交互并获取存储在服务器中的信息的应用程序时遇到问题。但是我在 第 53 行遇到了一些问题。请提供信息,因为我不知道为什么会这样。当我尝试使用离线直接“问题”时,它工作得很好。但是连接服务器时,每次都失败。
//Line 53
questions = list.get(index);
这就是我在 QuestionAnsActivity.java
中所做的...
import static com.company.appname.QuizSplash.list;
...
public class QuestionAnsActivity extends AppCompatActivity
...
List<Questions> allQuestionsList;
Questions questions;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.question_ans_activity);
...
allQuestionsList = list;
Collections.shuffle(allQuestionsList);
// The below code is my line 53
questions = list.get(index);
这就是我在 QuizSplash.java
中所做的public class QuizSplash extends AppCompatActivity
public static ArrayList<Questions> list;
DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz_splash);
list = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("Question");
databaseReference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
for (DataSnapshot dataSnapshot : snapshot.getChildren())
Questions questions = dataSnapshot.getValue(Questions.class);
list.add(questions);
@Override
public void onCancelled(@NonNull DatabaseError error)
);
Intent intent = new Intent(QuizSplash.this, QuestionAnsActivity.class);
startActivity(intent);
这在 Questions.java
中public class Questions
String question;
String option1;
String option2;
String option3;
String option4;
String answer;
//==================================================================================================
// Empty constructor
//==================================================================================================
public Questions()
//==================================================================================================
// Constructor
//==================================================================================================
public Questions(String question, String option1, String option2,
String option3, String option4, String answer)
this.question = question;
this.option1 = option1;
this.option2 = option2;
this.option3 = option3;
this.option4 = option4;
this.answer = answer;
//==================================================================================================
// Getter and setter methods start here
//==================================================================================================
public String getQuestion()
return question;
public void setQuestion(String question)
this.question = question;
public String getOption1()
return option1;
public void setOption1(String option1)
this.option1 = option1;
public String getOption2()
return option2;
public void setOption2(String option2)
this.option2 = option2;
public String getOption3()
return option3;
public void setOption3(String option3)
this.option3 = option3;
public String getOption4()
return option4;
public void setOption4(String option4)
this.option4 = option4;
public String getAnswer()
return answer;
public void setAnswer(String answer)
this.answer = answer;
【问题讨论】:
问题发生在第 53 行之前。越界异常意味着列表不包含该索引。由于您正在查询第一个索引 (0),这意味着您有一个空列表。如果列表没有被实例化,你会得到一个不同的错误,我猜这个问题来自你覆盖的 onDataChange 方法 熟悉使用 firebase 的人可能会立即指出您的问题,但您很可能需要添加日志记录以帮助识别问题。 【参考方案1】:如我所见,您有两个班级。您实际执行数据库调用以获取问题的 QuizSplash 类和 QuestionAnsActivity 类,您将来自数据库的结果分配给名为 allQuestionsList
的现有列表。但这不是您处理实时数据库的方式。
不要忘记数据是从实时数据库异步加载的,这意味着任何需要数据库数据的代码都需要在 onDataChange()
方法中,或者从那里调用。因此,您不能将 list
对象设置为 public 和 static 并简单地在另一个活动中使用它。您需要等待数据完成加载。因此,您可以在回调中使用该列表,也可以使用我在以下帖子中的回答:
我已经解释了如何使用接口传播结果。如果您了解 Kotlin,您可能也有兴趣阅读以下文章:
How to read data from Firebase Realtime Database using get()?【讨论】:
你能告诉我应该在哪里具体更改代码。因为我根本不擅长这种事情。也许你应该给我看代码以及我可以在哪里使用它。 Rafi,您应该根据答案中的信息自行尝试,如果出现其他问题,请提出另一个问题。请记住,当您发布另一个问题时,我们愿意为您提供进一步的帮助。 你说我必须等待数据加载。但是我可以使用持续时间约为 3 秒的加载页面吗,这样行吗? 是的,确实需要等待数据。如果这是您需要的,那么您可以使用页面并指示进度条,同时从数据库中获取数据。这是一种常见的做法。以上是关于java.lang.IndexOutOfBoundsException:从firebase服务器获取数据时索引:0,大小:0的主要内容,如果未能解决你的问题,请参考以下文章