简体   繁体   English

错误:Android上的java.lang.ArrayIndexOutOfBoundsException

[英]error : java.lang.ArrayIndexOutOfBoundsException on Android

I have this code : indexOfChromosomes : 48 indexOfGens : 20 double Truncation; 我有这段代码:indexOfChromosomes:48 indexOfGens:20 double Truncation; double Crossover; 双交叉; double Mutation; 双突变 int Generation; int代;

private Context context;

int indexOfChromosomes;
int indexOfGens;
int gensNumber;
int chromosomesNumber;

public AdapterDB(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx)
{
    this.indexOfGens = Bits;
    this.Truncation = Truncation;
    this.Crossover = Crossover;
    this.Mutation = Mutation;
    this.indexOfChromosomes = Chromosomes;
    this.Generation = Generation;
    this.context = ctx;
    DBHelper = new DatabaseHelper (context);
}

String [][] population = new String[indexOfChromosomes][indexOfGens];

    public void generateChromosome()
{       
    for(chromosomesNumber = 0; chromosomesNumber < indexOfChromosomes ; chromosomesNumber++)
    {
                    int o = 0;
        for(gensNumber = 0; gensNumber < 12 ; gensNumber++)
        {
            Cursor l = db.rawQuery("SELECT _id, key_foodstuff, key_calorie, key_carbohydrate, key_fat, key_protein FROM (food INNER JOIN categories ON food.key_nocategory = categories.nocategories) WHERE key_type='primary' AND _id!=164 AND (key_carbohydrate!=0 OR key_protein!=0 OR key_fat!=0) ORDER BY RANDOM() LIMIT 1", null);

            if((l.moveToFirst()) && (l!=null))
            {   
                if (o == indexOfGens)
                {
                    gensNumber = 0;
                    sumOfCarbohydrateMor = 0;
                    sumOfFatMor = 0;
                    sumOfProteinMor = 0;
                    sumOfCalorieMor = 0;
                    o = 0;
                }

                population[chromosomesNumber][gensNumber] = l.getString(0);
                morning_food[k] = l.getString(3);
                sumOfCarbohydrateMor = sumOfCarbohydrateMor + Double.parseDouble(morning_food[k]);  
                morning_food[f] = l.getString(4);
                sumOfFatMor = sumOfFatMor + Double.parseDouble(morning_food[f]);
                morning_food[p] = l.getString(5);   
                sumOfProteinMor = sumOfProteinMor + Double.parseDouble(morning_food[p]);
                morning_food[c] = l.getString(2);   
                sumOfCalorieMor = sumOfCalorieMor + Double.parseDouble(morning_food[c]);
                if (((sumOfCarbohydrateMor >= (morning_car-(morning_car*0.2))) && (sumOfCarbohydrateMor <= morning_cal*1.1)) && ((sumOfProteinMor >= (morning_pro-(morning_pro*0.2))) && (sumOfProteinMor <= morning_pro*1.1)) && ((sumOfFatMor >= (morning_fat-(morning_fat*0.2))) && (sumOfFatMor <= morning_fat*1.1)))
                //if((sumOfCarbohydrateMor > (morning_car*0.6)) && (sumOfProteinMor > (morning_pro*0.7)) && (sumOfFatMor > (morning_fat*0.8)))
                {
                    Log.e("lala", "lalala");
                    break;
                }

                if ((sumOfCarbohydrateMor > (morning_car*1.1)) || (sumOfProteinMor > (morning_pro*1.1)) || (sumOfFatMor > (morning_fat*1.1)) || (sumOfCalorieMor > (morning_cal*1.1))
                {

                    morning_food[k] = l.getString(3);
                    sumOfCarbohydrateMor = sumOfCarbohydrateMor - Double.parseDouble(morning_food[k]);
                    morning_food[f] = l.getString(4);
                    sumOfFatMor = sumOfFatMor - Double.parseDouble(morning_food[f]);
                    morning_food[p] = l.getString(5);
                    sumOfProteinMor = sumOfProteinMor - Double.parseDouble(morning_food[p]);
                    morning_food[c] = l.getString(2);
                    sumOfCalorieMor = sumOfCalorieMor - Double.parseDouble(morning_food[c]);
                    gensNumber--;
                    o++;

                }   

            }
        }

and it error in line : 48 并且它符合错误:48

The error says that : java.lang.ArrayIndexOutOfBoundsException 该错误表明:java.lang.ArrayIndexOutOfBoundsException

any idea? 任何想法? Thx u 谢谢你

This is your problem: 这是你的问题:

String [][] population = new String[indexOfChromosomes][indexOfGens];

This occurs outside your constructor, and is therefore executed before your constructor, when indexOfChromosomes and indexOfGens are both still 0. Put the initialization inside your constructor. 这发生构造函数之外 ,因此构造函数之前执行,当indexOfChromosomesindexOfGens都为0时。将初始化放在构造函数中。 Here's a simpler example showing the same problem: 这是一个显示相同问题的简单示例:

public class Test {
    private int size;

    public Test(int size) {
        this.size = size;
    }

    private String[] array = new String[size];

    public static void main(String[] args) {
        Test t = new Test(5);
        System.out.println(t.array.length);
    }
}

And the fixed version: 和固定版本:

public class Test {
    private int size;
    private String[] array;

    public Test(int size) {
        this.size = size;
        array = new String[size];
    }


    public static void main(String[] args) {
        Test t = new Test(5);
        System.out.println(t.array.length);
    }
}

Note that the positioning of the variable declaration with respect to the constructor makes no difference to the execution flow. 请注意,变量声明相对于构造函数的定位对执行流程没有影响。

EDIT: As for why it's now looping forever - in the middle of your code you have: 编辑:至于为什么它现在永远循环 - 在你的代码中间你有:

if (o == indexOfGens)
{
    gensNumber = 0;
    ...
}

which will reset the inner loop back to (nearly) the start (not quite the start, as gensNumber will be incremented at the end of the loop body, before the start of the next iteration). 这会将内循环重置回(几乎)开始(不完全是开始,因为gensNumber将在循环体的末尾递增,在下一次迭代开始之前)。

It's not at all clear what you're trying to do, but I suspect that's not helping. 一点也不清楚你想要做什么,但我怀疑这没有帮助。

I'd also encourage you to use local variables wherever possible - it's very unusual to use an instance variable as a loop counter, for example. 我也鼓励您尽可能使用局部变量-例如,将实例变量用作循环计数器是非常不寻常的。

Finally, I'd encourage you to break up your large method into smaller ones for readability. 最后,我建议您将大型​​方法分解为较小的方法,以提高可读性。

Try setting 尝试设置

population = new String[indexOfChromosomes][indexOfGens];

inside your adapterDB. 在你的adapterDB里面。

It looks like when you are initializing populatioin, indexOfChromosomes and indexOfGens are not initialized yet, so you are creating an array of size 0. So when you call 看起来当你初始化populatioin时,indexOfChromosomes和indexOfGens还没有初始化,所以你要创建一个大小为0的数组。所以当你调用时

population[chromosomesNumber][gensNumber] 

you get java.lang.ArrayIndexOutOfBoundsException 你得到java.lang.ArrayIndexOutOfBoundsException

It's because you define the population string outside a function, without initializing the indexOfChromosomes to 48 and the indexOfGens to 20. Try defining the population at the top and setting it to something new in the adapter, AFTER you've set your variables. 这是因为您在函数外部定义了填充字符串,而没有将indexOfChromosomes初始化为48,将indexOfGens初始化为20。请尝试在顶部定义填充并将其设置为适配器中的新内容,然后再设置变量。 Something like this: 像这样的东西:

double Truncation;
double Crossover;
double Mutation;
int Generation;

private Context context;

int indexOfChromosomes;
int indexOfGens;
int gensNumber;
int chromosomesNumber;

String [][] population;

public AdapterDB(int Bits, double Truncation, double Crossover, double Mutation, int Chromosomes, int Generation, Context ctx)
{
    this.indexOfGens = Bits;
    this.Truncation = Truncation;
    this.Crossover = Crossover;
    this.Mutation = Mutation;
    this.indexOfChromosomes = Chromosomes;
    this.Generation = Generation;
    this.context = ctx;
    DBHelper = new DatabaseHelper (context);

    //Create population after initializing variables.
    population = new String[indexOfChromosomes][indexOfGens];
}   

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM