首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误: java.lang.ArrayIndexOutOfBoundsException: length=10;index=10

错误: java.lang.ArrayIndexOutOfBoundsException: length=10;index=10
EN

Stack Overflow用户
提问于 2016-05-05 00:36:49
回答 2查看 574关注 0票数 0

我为我缺乏经验道歉,但我已经盯着我的屏幕好几个小时了,试图让它工作,但我就是做不到。我知道有一个简单的解决方案我看不到,但我要么没有找到它,要么我无法理解我找到了什么。如果一个经验丰富的程序员看了这段代码,并在里面吐了一点,我不会感到惊讶,所以如果你有时间,请随时纠正我的错误。

好吧,所以我的目标是创建一个快速阅读应用程序,因为我认为它相对简单,但仍然足以让我学习。我已经创建了一款应用程序,可以让文本出现,并在单词之间循环,但一旦它结束,它就会在我面前抛出一个“不幸的,已经停止”,并返回到MainActivity。

代码语言:javascript
复制
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

**My code:**


      package com.example.android.speedread;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.view.View;
            import android.view.Window;
            import android.view.WindowManager;
            import android.widget.Button;
            import android.widget.TextView;

            public class ReadActivity extends AppCompatActivity {

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    requestWindowFeature(Window.FEATURE_NO_TITLE);
                    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_read);


                }

                public void onClickButtonStart(View view) {

                    //removes button once its clicked
                    Button btn_startReading = (Button) findViewById(R.id.btn_startReading);
                    btn_startReading.setVisibility(View.GONE);

                    //gets content from an EditText from another class
                    Bundle extras = getIntent().getExtras();
                    if (extras != null) {
                        String s = extras.getString("userInput");
                        final String[] words = s.split("\\s+");

                        //starts Thread for displaying said text
                        Thread t = new Thread() {

                            int currentWordNumber;

                            @Override
                            public void run() {
                                try {
                                    for (int i = 0; i < words.length; i++) {
                                        Thread.sleep(1000);
                                        runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                TextView tv_onScreenWord = (TextView) findViewById(R.id.tv_onScreenWord);

                                                //This is where I get an error, and I understand why I'm getting the error,
                                                //but I'm just not sure how to deal with it.
                                                tv_onScreenWord.setText(words[currentWordNumber = currentWordNumber + 1]);
                                            }
                                        });

                                    }
                                } catch (InterruptedException e) {

                                }

                            }

                        };

                        t.start();

                    }

                }
            }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**My layout code:**
     <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                tools:context="com.example.android.speedread1.ReadActivity"
                android:background="@color/colorPrimaryWhite">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="100sp"
                    android:textColor="#000000"
                    android:id="@+id/tv_onScreenWord"
                    android:layout_centerVertical="true"
                    android:layout_centerHorizontal="true" />

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Start"
                    android:id="@+id/btn_startReading"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:onClick="onClickButtonStart"
                    android:background="@color/colorPrimaryDark"
                    android:textColor="@color/colorPrimaryWhite" />
            </RelativeLayout>
EN

回答 2

Stack Overflow用户

发布于 2016-05-05 00:47:03

您正在使用currentWordNumber = currentWordNumber + 1currentWordNumber最初并未设置,因此它默认为整数默认值0。然后在每次访问时,在访问它之前迭代它的,所以第一次运行得到words[1],第二次运行得到words[2],最后一次运行得到words[words.length] (导致异常)。

使用currentWordNumber++而不是currentWordNumber = currentWordNumber + 1currentWordNumber。通常,x++意味着使用x,然后递增(因此,在第一次迭代时,它会给出单词,然后从0递增到1)。另一方面,您所做的等同于++x;您在使用之前设置了值(因此,在第一次迭代中,您从0递增到1,然后获得words1)。

或者,删除currentWordNumber并改用words[i]。这个外部索引添加了什么?

票数 0
EN

Stack Overflow用户

发布于 2016-05-05 00:49:21

当您计算表达式currentWordNumber = currentWordNumber + 1时,它在第一次迭代时的计算结果为1,而不是0,因此将处理第二个单词,而不是第一个单词。它在每次迭代中加1,因此在最后一次迭代中,表达式将等于words.length,它比数组的末尾多一个。

如果将表达式更改为currentWordNumber++,则用于在数组中查找值的值在递增之前是currentWordNumber的值,因此在第一次迭代时,数组索引将为0,然后currentWordNumber将递增为1。在第二次迭代中,数组索引将为1,currentWordNumber将递增为2,依此类推。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37033434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档