错误: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ü
这是你的问题:
String [][] population = new String[indexOfChromosomes][indexOfGens];
出现这种情况外你的构造,因此您的构造函数之前执行,当indexOfChromosomes
和indexOfGens
都是仍为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
将在循环体的末尾增加,在下一次迭代开始之前)。
这并不完全清楚你想要做什么,但我怀疑这没有帮助。
我还鼓励您使用当地变量尽可能 - 这是非常不寻常的使用实例变量作为循环计数器,例如。
最后,我鼓励你将你的大方法分解成更小的方法以提高可读性。
尝试设置
population = new String[indexOfChromosomes][indexOfGens];
您adapterDB内。
看起来当你初始化人口普查看人口,indexOfChromosomes和indexOfGens尚未初始化,所以要创建大小为0的数组像这样,当你调用
population[chromosomesNumber][gensNumber]
你的java.lang。ArrayIndexOutOfBoundsException
这是因为您在函数外定义了总体字符串,而没有将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];
}
是的,Thx有很多功能,但它会永久循环使用,怎么样? – Michelle
你确定它们实际上是48和20吗?你有没有做过任何调试? – SuperTron
是的,我确定,我已经在LogCat – Michelle
上显示不足信息。你给构造函数什么值? –