Problem z tablicą String (NullPointerException)

0

Witam,
Mam program który symuluje działanie Klasycznego Algorytmu Genetycznego.
Tablica String populacja[] posiada elementy w postaci np. ("001101001", "001101001").
Metoda "mutate2" polega na zamianie dowolnego losowego znaku w stringu w losowym elemencie tablicy populate na przeciwny (0->1; 1->0). Każdy element tablicy jest długości bytes*2 znaków.

przy populate[5] i mniejszych wszystko działa poprawnie algorytm wykonuje się kilkanaście tysięcy razy bez problemu.
Jednak dla tablic większych niz 5 wywala mi:
"Exception in thread "main" java.lang.NullPointerException"
ze wskazaniem na linię:
mutated = population[j].charAt(index);
i rzeczywiście w tablicy population pojawiają się null'e nie wiadomo skąd.
Kod metody:

	public void mutate2(double prob, int bytes)
	{
		Date now = new Date();
		int index;
		String temp;
		char mutated;
		Random rndm = new Random(now.getTime());
		for(int i=0; i<population.length*bytes*2; i++)
		{

			if(rndm.nextDouble()<prob)
			{
				int j;
				j=rndm.nextInt(population.length);
				index = rndm.nextInt(bytes*2);
				mutated = population[j].charAt(index);
				if(mutated=='1')
				{
					mutated='0';
				}else
				{
					mutated='1';
				}
				temp=population[j].substring(0, index)+mutated+population[j].substring(index+1);
				population[j]=temp;
			}
		}

	}

kod algorytmu w lepszej formie z numerami linii tutaj:
http://wklej.to/lMnb

Dodam jeszcze, że po wyłączeniu mutacji, gdy działa tylko selekcja(ruletka) wszystko działa, wiec problem musi tkwić w metodzie mutate2

0

Witam,
podaj argumenty dla tej f-cji z jakimi wywolujesz

0

Problem może leżeć zupełnie gdzieś indziej bo ta metoda pracuje na tablicy population, która najwidoczniej w jakiejś części wypełniona jest nullami. Podaj definicję tej tablicy i wszystkie fragmenty kodu w których przypisywane są wartości elementom tej tablicy. Czyli możesz wyszukać wszystkie miejsca na występowanie łańcucha "population[?]?=", gdzie ? jest dowolnym ciągiem znaków.
Jeżeli nie ma takich przypisań poza samą metodą mutate2, to metoda ta jest najprawdopodobniej błędna bo używa elementów tej tablicy przed przypisaniem im wartości (lub przynajmniej upewnieniem się czy pod jakimś indeksem cokolwiek występuje, zanim odczyta element).

ps. Jeżeli algorytm modyfikuje jakieś dane, to lepiej przechowywać te dane w formie nadającej się do modyfikacji. W tym wypadku zamiast Stringa należałoby użyć StringBuildera, albo inną tablicę znaków. Wtedy kod tej samej metody skróciłby się jakoś tak:

	public void mutate2(double prob, int bytes)
	{
		Random rndm = new Random(new Date().getTime());
		int licznik = 2 * bytes * population.length;
		while(licznik-->0)
			if(rndm.nextDouble() < prob)
			{
				int j = rndm.nextInt(population.length);
				int index = rndm.nextInt(2 * bytes);
				population[j].setCharAt(index,
					(population[j].charAt(index) == '0') ? '1' : '0');
			}
	}

W takim kodzie o wiele łatwiej szukać błędów. Oczywiście nadal pozostaje problem co, gdzie, kiedy i czym (wstępnie) wypełnia tablicę population[]

1 użytkowników online, w tym zalogowanych: 0, gości: 1