Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.ArrayIndexOutOfBoundsException:长度=3;索引=-1_Java_Android_Arrays_Firebase_Firebase Realtime Database - Fatal编程技术网

java.lang.ArrayIndexOutOfBoundsException:长度=3;索引=-1

java.lang.ArrayIndexOutOfBoundsException:长度=3;索引=-1,java,android,arrays,firebase,firebase-realtime-database,Java,Android,Arrays,Firebase,Firebase Realtime Database,我正试图从Firebase数据库中检索时间戳,并将其设置为x轴标签。对于数据点,每次检测到子级时,它都会绘制x值为索引,y值为100 应用程序不断崩溃并返回:java.lang.ArrayIndexOutOfBoundsException:length=3;索引=-1 我的节点中有3个子节点,但我不明白为什么索引一直返回-1 此数据库适用于1个用户。每当我点击另一个客户端时,“userid”就会指向另一个Firebase节点并检索fallstate。当我检索第一个客户机数据时,它工作正常。当我

我正试图从Firebase数据库中检索
时间戳
,并将其设置为x轴标签。对于数据点,每次检测到子级时,它都会绘制x值为索引,y值为100

应用程序不断崩溃并返回:
java.lang.ArrayIndexOutOfBoundsException:length=3;索引=-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);

        }
公共类FallHistory扩展了AppCompative活动{
字符串userid、fallstateValue、fallstateTimestamp;
FirebaseAuth-auth;
FirebaseUser用户;
数据库参考文献;
ArrayList array9;//数组的错误状态
ArrayList array10;//数组取消FallStateTimstamp
点图系列;
int x=0;
int i=1;
字符串[]xLabels;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u fall\u history);
auth=FirebaseAuth.getInstance();
user=auth.getCurrentUser();
最终GraphView图形=(GraphView)findViewById(R.id.graphFall);
series=新点GraphSeries();
最终StaticLabelFormatter StaticLabelFormatter=新的StaticLabelFormatter(图形);
图.addSeries(系列);
Viewport vp=graph.getViewport();
副总裁setXAxisBoundsManual(真实);
副总裁setMinX(0);
setMaxX副总裁(3);//yg ditunjukin max berapa
副总裁Setyaxis Bounds一年一次(真实);
setMinY副总裁(1);
setMaxY副总裁(200);//yg ditunjukin max berapa
graph.getViewport().setScrollable(true);//启用水平滚动
//graph.getViewport().setScrollableY(true);//启用垂直滚动
//graph.getViewport().setScalable(true);//启用水平缩放和滚动
//graph.getViewport().setScalableY(true);//启用垂直缩放和滚动
array9=new ArrayList();//数组解除错误状态
array10=new ArrayList();//数组取消错误状态时间戳
Intent=getIntent();
if(intent!=null)
{
userid=intent.getStringExtra(“userid”);
}
ref=FirebaseDatabase.getInstance().getReference().child(“用户”).child(用户ID);
ref.child(“fallstate”).child(“nilaifallstate”).addChildEventListener(新的ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
fallstateValue=dataSnapshot.child(“fallstate”).getValue(String.class);
FallStateTimstamp=dataSnapshot.child(“时间戳”).getValue(String.class);
Log.i(“fallstate值”、“fallstate值”+fallstate值);
Log.i(“秋季时间戳”、“秋季时间戳”+秋季状态时间戳);
数组9.添加(fallstateValue);
array10.add(FallStateTimstamp);
x=x+1;
数据点=新数据点(x,100);
系列数据(点,真值,1000);
xLabels=新字符串[array10.size()];
阵列10.toArray(xLabels);
graph.getGridLabelRenderer().setHumanRounding(true);
graph.getGridLabelRenderer().setHorizontalLabelsAngle(90);
graph.getGridLabelRenderer().setLabelFormatter(新的DefaultLabelFormatter()
{
@凌驾
公共字符串formatLabel(双值,布尔值isValueX)
{
if(isValueX)
{
返回xLabels[(int)值];
}
返回super.formatLabel(值,isValueX);
}
});
Log.i(“xlabels”、“xlabels”+xlabels);
}
请告诉我我做错了什么。

此错误:

java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1
表示数组中有3个元素,您试图从错误的索引中获取元素。这三个元素分别位于索引0、1和2处,因为在Java中,数组索引以
0
开头

还请注意,
onchildaded
方法是异步的。使用以下代码行时:

Log.i("xlabels", "xlabels " + xLabels);

您的数组将始终为空。

请记住,此错误可能是由于同时从不同的线程访问
列表所导致的,因为
列表
不是线程安全的。您是否有多个线程?发布更多代码和完整异常也很好。我已经更新了代码,但不知道是什么你的意思是从多线程访问。我做错了什么?顺便说一句谢谢!!但我真的不理解索引部分。我在哪里把索引设置为-1?另外,当我尝试访问具有2个秋天数据的用户时,我得到java.lang.ArrayIndexOutOfBoundsException:length=2;index=-2然后我尝试访问具有1个秋天数据的用户,我得到:java.lang.ArrayIndexOutOfBoundsException:length=1;index=-3Yes,这是因为您再次尝试从错误的索引中获取元素。我假设您在这一行代码
return super.formatLabel(value,isValueX)中得到该错误
,对吗?因此,请尝试更改访问通过正确索引的数组的方式。另请参阅我更新答案中的注释。一切正常吗?您解决了问题吗?