【问题标题】:after initilize array of object successfully the application crash成功初始化对象数组后,应用程序崩溃
【发布时间】:2020-05-27 14:46:04
【问题描述】:

我想从字符串数组中初始化一个对象数组。

我有一个包含 6 个字符串记录的数组,我想用相同的字符串记录初始化两个对象,这意味着数组对象将有 12 个记录。

由于某种原因,我设法实例化了对象数组,但在循环结束后应用程序崩溃了。

public class Card {
    private String pic;

    public Card(String pic) {
        this.pic = pic;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    @Override
    public String toString() {
        return "Card{" +
                "pic='" + pic + '\'' +
                '}';
    }
}

卡片文件结束。

package com.example.memorygame;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private void main() {
        String[] pictures = {"crocodile", "duck", "lizard", "mosqitue", "parrot", "zebra"};
        //String[] pictures = {"crocodile", "crocodile", "duck","duck", "lizard","lizard", "mosqitue","mosqitue", "parrot","parrot", "zebra" ,"zebra"};
        Card[] cards = new Card[pictures.length*2];
        Functions functions = new Functions();

        for (int i = 0; i < cards.length*2; i+=2) {
            cards[i] = new Card(pictures[i/2]);
            cards[i + 1] = new Card(pictures[i/2]);
            Log.i("case", cards[i].getPic()+" "+String.valueOf(i));
            Log.i("case", cards[i].getPic()+" "+String.valueOf(i+1));
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main();
    }
}

这是控制台日志,表明阵列已完全堆叠,然后应用程序崩溃。

2020-05-27 17:36:37.345 358-358/? I/case: crocodile 0
2020-05-27 17:36:37.345 358-358/? I/case: crocodile 1
2020-05-27 17:36:37.345 358-358/? I/case: duck 2
2020-05-27 17:36:37.345 358-358/? I/case: duck 3
2020-05-27 17:36:37.345 358-358/? I/case: lizard 4
2020-05-27 17:36:37.345 358-358/? I/case: lizard 5
2020-05-27 17:36:37.345 358-358/? I/case: mosqitue 6
2020-05-27 17:36:37.345 358-358/? I/case: mosqitue 7
2020-05-27 17:36:37.345 358-358/? I/case: parrot 8
2020-05-27 17:36:37.345 358-358/? I/case: parrot 9
2020-05-27 17:36:37.345 358-358/? I/case: zebra 10
2020-05-27 17:36:37.345 358-358/? I/case: zebra 11

在这些日志之后我什么都没有,我也找不到应用程序崩溃的任何原因。

【问题讨论】:

  • 当你进入两倍于实际数组大小的 i 范围时,你认为会发生什么?你不是让数组索引超出范围异常吗?
  • 阅读this article 了解调试代码的技巧。

标签: java android arrays


【解决方案1】:

您使用错误的长度进行迭代,导致 IndexOutOfBoundsException,因此应用程序崩溃。

for (int i = 0; i < cards.length; i+=2) {
        cards[i] = new Card(pictures[i/2]);
        cards[i + 1] = new Card(pictures[i/2]);
        Log.i("case", cards[i].getPic()+" "+String.valueOf(i));
        Log.i("case", cards[i+1].getPic()+" "+String.valueOf(i+1));
    }

而且在最后的 Log.i 行中,您打印了 card[i] 的值,它给出了相同的值,但它错误的是它只打印了 0、2、4、6、8、10 的值。 它应该打印 0,1,2,3,4,5,6,7,8,9,10,11 的值。

【讨论】:

  • 我觉得i &lt; pictures.length 比 i+=2 更易读,然后用 i/2 来获取图片
  • @SairajSawant ,是的,它更具可读性,但问题是我们要在 card 中添加值,所以最好用 card.length 进行迭代,尽管在他的要求中两者都是正确的。
【解决方案2】:

你是iterating i &lt; cards.length*2,这会在 i+=2 上导致ArrayIndexOutOfBoundsException,而条件应该是i &lt; pictures.length。尝试在循环中更改以下条件,它应该可以正常工作。

 for (int i = 0; i < pictures.length; i++) {
      cards[2*i] = new Card(pictures[i]);
      cards[2*i + 1] = new Card(pictures[i]);
      Log.i("case", cards[2*i].getPic()+" "+String.valueOf(i));
      Log.i("case", cards[2*i+1].getPic()+" "+String.valueOf(i+1));
}

另外,请确保您的 logcat 的配置为 this,以便在应用崩溃时能够看到异常。

【讨论】:

  • 这将只生成 12 条记录中的 7 条记录
  • 更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多