2011-11-17 2 views
1

이 코드를 가지고 있습니다 : indexOfChromosomes : 48 indexOfGens : 20 double truncation; 이중 크로스 오버; 이중 돌연변이; int 세대;오류 : Android의 경우 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

? 들으이 문제

+0

실제로 48과 20인지 확인 하시겠습니까? 디버깅을 한 적이 있습니까? – SuperTron

+0

예. LogCat – Michelle

+0

정보가 부족합니다. 당신이 생성자에게주고있는 가치는 무엇입니까? –

답변

1

입니다 U :

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

예 Thx 많음 ,하지만 그것은 영원히 반복됩니다, 어떻게? – Michelle

+0

@Michelle : 코드에 하나 이상의 버그가 있음을 나타냅니다. 나는주의 깊게 살펴 보길 권합니다 - 나는 단지 당신이 제기 한 첫 번째 문제를 해결하려고했습니다 ... –

+0

Hoo Thx u, 나는 이미 이것을 시도했습니다. day> _ <그리고 나는 내가해야 할 일을 혼란시켰다. String [] [] population = new String [indexOfChromosomes] [indexOfGens]; generateChromosomes()에서도 작동하지만 영원히 반복합니다. 어쨌든 Thx a = D – Michelle

1

에 한번 당신의 adapterDB 내부

population = new String[indexOfChromosomes][indexOfGens]; 

설정.

그것은 그래서 당신은 당신이주는 java.lang을 얻을

population[chromosomesNumber][gensNumber] 

를 호출 할 때 populatioin, indexOfChromosomes를 초기화하는 당신은 크기 0의 배열을 만들 수 있도록 indexOfGens는 아직 초기화되지 않은 경우처럼 보인다.ArrayIndexOutOfBoundsException

+0

예 Thx 많이 작동하지만 영원히 반복됩니다. 어떻게? – Michelle

+0

gensNumber--;가 있습니다. 당신의 내부. 어쩌면 문제가 발생하고 당신을 for 루프에서 내 보내지 않을 것입니다. – marimaf

+0

하지만이 조건도 있습니다 : if ((sumOfCarbohydrateMor> = (morning_car- (morning_car * 0.2))) && (sumOfCarbohydrateMor <= morning_cal * 1.1)) && ((sumOfFatMor> = (morning_fat- (morning_fat * 0.2))) && (sumOfFatMor <= morning_pro * 1.1) && (sumOfProteinMor> = (morning_pro-))) { Log.e ("lala", "lalala"); 휴식; } 왜 읽히지 않습니까? _ < – Michelle

1

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

관련 문제