错误:java.lang.ArrayIndexOutOfBoundsException:length = 10;指数= 10

时间:2016-05-04 16:36:49

标签: java android-studio

我为自己缺乏经验而道歉,但我一直盯着我的屏幕试图完成这项工作多个小时,而我却做不到。我知道有一个简单的解决方案,我看不到,但我要么没有找到它,要么我无法理解我发现的东西。如果一个经验丰富的程序员看到这个代码然后向内部扔了一点,我就不会感到惊讶,如果你有时间,可以随意纠正我。

好的,所以我的目标是创建一个速读应用程序,因为我认为它会相对简单,但仍然足以让我学习。我创建了一个应用程序,使文本显示,并循环显示单词,但一旦它结束它会在我的脸上抛出“不幸,已经停止”并返回到MainActivity。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

**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>

2 个答案:

答案 0 :(得分:0)

您正在使用currentWordNumber = currentWordNumber + 1。最初未设置currentWordNumber,因此默认为0的整数默认值。然后在每次访问时,您都会在访问之前对其进行迭代,因此您将获得{{1}对于第一次运行,words[1]用于第二次运行,...,words[2]用于最后一次运行(导致异常)。

使用words[words.length]代替currentWordNumber++currentWordNumber = currentWordNumber + 1。通常,currentWordNumber表示使用x,然后递增(因此,在第一次迭代时,它会给出单词[0],然后从0增加到1)。另一方面,你所做的相当于x++;你在>之前设置值(因此,在第一次迭代中,你从0增加到1,然后得到单词[1])。

或者,移除++x并改用currentWordNumber。这个外部索引添加了什么?

答案 1 :(得分:0)

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

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