应用程序崩溃在数组的末尾 [英] App crashing at the end of array

查看:124
本文介绍了应用程序崩溃在数组的末尾的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序在bluestacks数组的结尾崩溃。我不知道为什么。

当我点击下一步按钮在阵列,应用程序崩溃的结束。我还测试了我的电话,同样的结果。的应用功能,其余如预期。

这是我所知道的i(%)= image_elements.length;被认为是该循环阵列的功能

我是pretty确认这是在崩溃的来源。

 我++;element.setImageResource(image_elements [I]);
name.setImageResource(image_names [I]);I%= image_elements.length;

全部code以下

 公共类实践扩展MainMenuActivity {    INT I = 0;
    最终诠释[] = image_elements {
        R.drawable.spr_elements_0,
        R.drawable.spr_elements_1,
        [...]
        R.drawable.spr_elements_86,
        R.drawable.spr_elements_87,
    };
    最终诠释[] = image_names {
        R.drawable.spr_name_0,
        R.drawable.spr_name_1,
        [...]
        R.drawable.spr_name_86,
        R.drawable.spr_name_87,
    };    保护无效的onCreate(捆绑savedInstanceState){
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.practice);            最后ImageView的元素=(ImageView的)findViewById(R.id.element);
            最后ImageView的名字=(ImageView的)findViewById(R.id.name);            按钮Next按钮=(按钮)findViewById(R.id.buttonNext);
            nextButton.setOnClickListener(新View.OnClickListener(){
                    公共无效的onClick(视图v){
                            我++;                            element.setImageResource(image_elements [I]);
                            name.setImageResource(image_names [I]);                            I%= image_elements.length;
                    }
            });
    }
    公共无效后退按钮(查看视图){
            意图Z =新意图(这一点,MainMenuActivity.class);
            startActivity(Z);
    }
}


解决方案

您需要从该重新排列code:

 我++;                        element.setImageResource(image_elements [I]);
                        name.setImageResource(image_names [I]);                        I%= image_elements.length;

这样:

 我++;
                        I%= image_elements.length;                        element.setImageResource(image_elements [I]);
                        name.setImageResource(image_names [I]);

会发生什么情况,否则是索引递增超出阵列的边界,并与该模运算事后更正。你需要的校正的的使用索引。

I%= image_elements.length 在这种特殊情况下,在本质上是一样的。

 如果(我== image_elements.length){
    I = 0;
}

数组索引从 0 长度-1

您可以通过查找按名称的资源,比如这摆脱了阵列的全部:

 最终静态INT MAX_ELEMENTS = 88; //这包括0..87
私人INT指数= 0;保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.practice);        最后ImageView的元素=(ImageView的)findViewById(R.id.element);
        最后ImageView的名字=(ImageView的)findViewById(R.id.name);
        最终资源解析度= this.getResources();
        最后弦乐PKGNAME = this.getPackageName();        按钮Next按钮=(按钮)findViewById(R.id.buttonNext);
        nextButton.setOnClickListener(新View.OnClickListener(){
                公共无效的onClick(视图v){
                        最终诠释imgId = res.getIdentifier(spr_elements_+指数绘制,PKGNAME);
                        最终诠释NameID的= res.getIdentifier(spr_name_+指数绘制,PKGNAME);
                        element.setImageResource(imgId);
                        name.setImageResource(NameID的);                        指数=(索引+ 1)%MAX_ELEMENTS;
                }
        });
}

My app is crashing at the end of the array in bluestacks. I have no idea why.

When I click the next button at the end of the array, the app crashes. I also tested it on my phone, same result. The rest of the app functions as intended.

From what I know "i %= image_elements.length;" is supposed to be the function that loops the array.

I am pretty sure this is where the crash is coming from.

i++;

element.setImageResource(image_elements[i]);
name.setImageResource(image_names[i]);

i %= image_elements.length;

Full code below

public class Practice extends MainMenuActivity {

    int i = 0;
    final int[] image_elements = {
        R.drawable.spr_elements_0,
        R.drawable.spr_elements_1,
        [...]
        R.drawable.spr_elements_86,
        R.drawable.spr_elements_87,
    };
    final int[] image_names = {
        R.drawable.spr_name_0,
        R.drawable.spr_name_1,
        [...]
        R.drawable.spr_name_86,
        R.drawable.spr_name_87,
    };

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.practice);

            final ImageView element = (ImageView) findViewById(R.id.element);
            final ImageView name = (ImageView) findViewById(R.id.name);

            Button nextButton = (Button) findViewById(R.id.buttonNext);
            nextButton.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                            i++;

                            element.setImageResource(image_elements[i]);
                            name.setImageResource(image_names[i]);

                            i %= image_elements.length;
                    }
            });
    }
    public void backButton(View view) {
            Intent z = new Intent(this, MainMenuActivity.class);
            startActivity(z);
    }
}

解决方案

You'll need to rearrange your code from this:

                        i++;

                        element.setImageResource(image_elements[i]);
                        name.setImageResource(image_names[i]);

                        i %= image_elements.length;

to this:

                        i++;
                        i %= image_elements.length;

                        element.setImageResource(image_elements[i]);
                        name.setImageResource(image_names[i]);

What happens otherwise is that the index is incremented beyond the boundaries of the array, and that is corrected afterwards with the modulus operator. You'll need to the the correction before you use the index.

i %= image_elements.length in this particular case, is essentially the same as

if( i == image_elements.length ) {
    i = 0;
}

Arrays indices go from 0 to length-1.

You could get rid of the arrays entirely by looking up the resources by name, such as this:

final static int MAX_ELEMENTS = 88; // this includes 0..87
private int index = 0;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.practice);

        final ImageView element = (ImageView) findViewById(R.id.element);
        final ImageView name = (ImageView) findViewById(R.id.name);
        final Resources res = this.getResources();
        final String pkgName = this.getPackageName();

        Button nextButton = (Button) findViewById(R.id.buttonNext);
        nextButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                        final int imgId = res.getIdentifier( "spr_elements_" + index, "drawable", pkgName );
                        final int nameId = res.getIdentifier( "spr_name_" + index, "drawable", pkgName );
                        element.setImageResource( imgId );
                        name.setImageResource( nameId );

                        index = (index+1) % MAX_ELEMENTS;
                }
        });
}

这篇关于应用程序崩溃在数组的末尾的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆