java - java.lang.ArrayIndexOutOfBoundsException:长度=3;指数=-1
问题描述
我正在尝试Timestamp
从此 Firebase 数据库中检索,并将其设置为 x 轴标签。对于数据点,每次检测到孩子时,它都会绘制 x 值为索引,y 值为 100。
应用程序不断崩溃并返回:java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1
我的节点中有 3 个孩子,但我无法弄清楚为什么我的索引不断返回-1。
此数据库适用于 1 个用户。每当我单击另一个客户端时,“userid”都会引用另一个 Firebase 节点并检索 fallstate。当我检索第一个客户端数据时,它工作得很好。当我单击第二个并尝试检索数据时,它不起作用。请告诉我我做错了什么。
这是我的代码:
public class FallHistory extends AppCompatActivity{
String userid, fallstateValue, fallstateTimestamp;
FirebaseAuth auth;
FirebaseUser user;
DatabaseReference ref;
ArrayList<String> array9; //array untuk fallstate
ArrayList<String> array10; //array untuk fallstateTimeStamp
PointsGraphSeries<DataPoint> series ;
int x=0;
int i = 1;
String[] xLabels ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fall_history);
auth = FirebaseAuth.getInstance();
user = auth.getCurrentUser();
final GraphView graph = (GraphView)findViewById(R.id.graphFall);
series = new PointsGraphSeries<>();
final StaticLabelsFormatter staticLabelsFormatter = new StaticLabelsFormatter(graph);
graph.addSeries(series);
Viewport vp = graph.getViewport();
vp.setXAxisBoundsManual(true);
vp.setMinX(0);
vp.setMaxX(3); //yg ditunjukin max berapa
vp.setYAxisBoundsManual(true);
vp.setMinY(1);
vp.setMaxY(200); //yg ditunjukin max berapa
graph.getViewport().setScrollable(true); // enables horizontal scrolling
//graph.getViewport().setScrollableY(true); // enables vertical scrolling
//graph.getViewport().setScalable(true); // enables horizontal zooming and scrolling
//graph.getViewport().setScalableY(true); // enables vertical zooming and scrolling
array9 = new ArrayList<>(); //array untuk fallstate
array10 = new ArrayList<>(); //array untuk fallstate timeStamp
Intent intent = getIntent();
if(intent!=null)
{
userid = intent.getStringExtra("userid");
}
ref = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);
ref.child("fallstate").child("nilaifallstate").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fallstateValue = dataSnapshot.child("fallstate").getValue(String.class);
fallstateTimestamp = dataSnapshot.child("Timestamp").getValue(String.class);
Log.i("fallstate value", "fallstate value " + fallstateValue);
Log.i("fall timestamp", "fall timestamp " + fallstateTimestamp);
array9.add(fallstateValue);
array10.add(fallstateTimestamp);
x = x + 1;
DataPoint point = new DataPoint(x, 100);
series.appendData(point, true, 1000);
xLabels = new String[array10.size()];
array10.toArray(xLabels);
graph.getGridLabelRenderer().setHumanRounding(true);
graph.getGridLabelRenderer().setHorizontalLabelsAngle(90);
graph.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter()
{
@Override
public String formatLabel(double value, boolean isValueX)
{
if (isValueX)
{
return xLabels[(int) value];
}
return super.formatLabel(value,isValueX);
}
});
Log.i("xlabels", "xlabels " + xLabels);
}
请告诉我我做错了什么。
解决方案
这个错误:
java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1
意味着您的数组中有 3 个元素,并且您试图从不正确的索引中获取一个元素。这三个元素放在索引 0、1 和 2 处,因为在 Java 中,数组索引以0
!
另请注意,该onChildAdded
方法是异步的。使用以下代码行时:
Log.i("xlabels", "xlabels " + xLabels);
您的数组将始终为空。
推荐阅读
- javascript - 在反应中调用状态
- python - 使用 python 获取文本文件内容。以及关于 matplotlib 语法的问题
- salesforce - Salesforce/SOQL:如何从 Account 中检索所有列名?
- java - 1 秒计时器每秒激活多次
- c - 删除链表上的头部
- azure - 如何在 Office 365/Azure 中使用 Powershell 添加/更新自定义 DNS A 记录?所以我可以在 ISP 更改 IP 地址时更新它
- c# - 具有最大字段宽度的 C# 插值字符串
- c - 输入行末尾的空格导致while循环比它应该多走一次
- javascript - 检查cookie并使用jQuery重定向用户?
- sql - 有没有办法在 SQL SELECT 语句中按数字选择某一行?