错误:Android上的java.lang.ArrayIndexOutOfBoundsException

问题描述:

我有此代码: indexOfChromosomes:48 indexOfGens:20 double截断; double Crossover; double mutation; int Generation;错误:Android上的java.lang.ArrayIndexOutOfBoundsException

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++; 

       } 

      } 
     } 

,并错误行:48

错误说:java.lang.ArrayIndexOutOfBoundsException

什么想法? THXü

+0

你确定它们实际上是48和20吗?你有没有做过任何调试? – SuperTron

+0

是的,我确定,我已经在LogCat – Michelle

+0

上显示不足信息。你给构造函数什么值? –

这是你的问题:

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

出现这种情况你的构造,因此您的构造函数之前执行,当indexOfChromosomesindexOfGens都是仍为0把初始化您的构造函数。下面是显示了同样的问题一个简单的例子:

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); 
    } 
} 

和固定版本:

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); 
    } 
} 

注意,相对于构造函数的变量声明的定位使得来执行流程没有什么区别。

编辑:至于为什么它现在循环永远 - 在你的代码中你有:

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

将内环重置回(几乎)开始(并不完全是开始,因为gensNumber将在循环体的末尾增加,在下一次迭代开始之前)。

这并不完全清楚你想要做什么,但我怀疑这没有帮助。

我还鼓励您使用当地变量尽可能 - 这是非常不寻常的使用实例变量作为循环计数器,例如。

最后,我鼓励你将你的大方法分解成更小的方法以提高可读性。

+0

Yes Thx a it works ,但它会永远循环,怎么样? – Michelle

+0

@Michelle:这表明你的代码中有多个错误:)我建议你仔细看看 - 我只是试图解决你提出的第一个问题... –

+0

Hoo Thx你,我已经试过了我很困惑我应该怎么做,上次我试图把String [] [] population = new String [indexOfChromosomes] [indexOfGens];在generateChromosomes()上,它也可以工作,但是也会永远循环。无论如何Thx很多= D – Michelle

尝试设置

population = new String[indexOfChromosomes][indexOfGens]; 

您adapterDB内。

看起来当你初始化人口普查看人口,indexOfChromosomes和indexOfGens尚未初始化,所以要创建大小为0的数组像这样,当你调用

population[chromosomesNumber][gensNumber] 

你的java.lang。ArrayIndexOutOfBoundsException

+0

是的,它有很多工作,但它会永远循环,如何? – Michelle

+0

你有一个gensNumber--;在你的if里面。如果(((sumOfCarbohydrateMor> =(morning_car-(morning_car * 0.2))))&&(sumOfCarbohydrateMor marimaf

+0

。 &&((sumOfProteinMor> =(morning_pro-(morning_pro * 0.2)))&&(sumOfProteinMor =(morning_fat-(morning_fat * 0.2)))&&(sumOfFatMor Michelle

这是因为您在函数外定义了总体字符串,而没有将indexOfChromosomes初始化为48,将indexOfGens初始化为20.尝试在顶部定义总体并将其设置为适配器中的新内容,在设置好后你的变量。就像这样:

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]; 
} 
+0

是的,Thx有很多功能,但它会永久循环使用,怎么样? – Michelle