【问题标题】:How to fix application crash in for-loop using an array如何使用数组修复for循环中的应用程序崩溃
【发布时间】:2019-07-12 23:42:05
【问题描述】:

我的问题可能与标题不同。我有一个默认为“visibility.Gone”的Edittext:

XML 文件:

<EditText
android:id="@+id/edit5"
android:layout_width="203dp"
android:layout_height="wrap_content"
android:hint="edit5"
android:inputType="textPersonName"
android:gravity="center"
android:visibility="gone" />

有一个名为“increasebtn”的按钮,点击后可以看到编辑文本:

if (edit5.getVisibility() == View.GONE) {
        edit6.setVisibility(View.VISIBLE);
        edit5.setVisibility(View.VISIBLE);
}

我有一个 for 循环,可以在 textview 中打印一些字符串:

String editt1 = edit1.getText().toString();
                    String editt2 = edit2.getText().toString();
                    String editt3 = edit3.getText().toString();
                    String editt4 = edit4.getText().toString();
                    String editt5 = edit5.getText().toString();


                    String[] names = {editt2, editt1, editt3, editt4};
                    List<String> namesstr = Arrays.asList(names);
                    Collections.shuffle(namesstr);
                    names = namesstr.toArray(new String[namesstr.size()]);


                    StringBuilder text = new StringBuilder();
                    for (int i = 0; i < names.length; i = i + 2) {
                        text.append(names[i] + " with " + names[i + 1]);

                    }
                    textView.setText(text.toString());

这些代码没问题,结果是这样的:

金和山姆 约翰与爱迪生

问题是

当我将 VISIBLE(不是不可见)添加到名为“names”的字符串时,应用程序崩溃。问题不在于

String editt5 = edit5.getText().toString();

是这样的:

String[] names = {editt2, editt1, editt3, editt4,editt5};

当我将“editt5”添加到字符串时,应用程序崩溃:(

【问题讨论】:

  • 异常的堆栈跟踪可能会有所帮助。
  • 也许,因为您添加的是 editt5 而不是 editt6,所以当 for 循环中 i=5 的值时,它会尝试获取数组 (i+1) 中的插槽 6,这不会存在,这就是你得到错误的原因......

标签: android arrays for-loop


【解决方案1】:

names中有4个项目,那么这个循环:

for (int i = 0; i < names.length; i = i + 2) {
    text.append(names[i] + " with " + names[i + 1]);
}

附加到StringBuilder:

names[0] + " with " + names[1]
names[2] + " with " + names[3]

可行,但如果有 5 个项目,它将尝试追加:

names[0] + " with " + names[1]
names[2] + " with " + names[3]
names[4] + " with " + names[5]

但是没有names[5],因为最后一个项目的索引是4,并且您的应用程序崩溃了。
您必须在names 中有偶数个项目才能应用此循环,除非您想要这样的东西:

for (int i = 0; i < names.length - 1; i++) {
    text.append(names[i] + " with " + names[i + 1]);
}

这会给你这个:

names[0] + " with " + names[1]
names[1] + " with " + names[2]
names[2] + " with " + names[3]
names[3] + " with " + names[4]

【讨论】:

    【解决方案2】:

    它崩溃了,因为你收到了java.lang.ArrayIndexOutOfBoundsException

    为什么?因为当你在数组中有 5 个元素时,像这样

    String[] names = {editt2, editt1, editt3, editt4,editt5};
    

    然后在第二个循环之后i 变为 4,这是names 的实际长度。但在循环内部,您试图获得names[i + 1],即names[5]

    数组索引从 0 开始,所以 names[5] 表示第 6 个元素。但是你没有它,它导致了崩溃。

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2019-03-11
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多