Program się zawiesza

0

Piszę program do łamania szyfru afinicznego. Gdy znajdzie poprawny klucz, musi on wstrzymywać swoje działanie i spytać użytkownika czy tekst odszyfrowany według domniemanego klucza jest sensowny (znaleziono właściwy klucz, koniec działania) czy też nie (dalsze poszukiwanie).

Próbowałem rozwiązać to w ten sposób, że w klasie, która zajmuje się poszukiwaniem właściwego klucza, umieściłem niewidzialny button. Kiedy zostanie znaleziony prawdopodobny klucz na przycisku wywołuję metodę doClick(), klasa implementująca ActionListenera odbiera zdarzenie i dalej powinno odbyć się próbne dekodowanie i wyświetlenie pytania czy tak odkodowany tekst jest ok, czy dalej poszukiwać klucza.

Niestety, program nie dokonuje próbnej deszyfracji tylko zawiesza się i jedynym wyjściem jest zabicie procesu. Sprawdziłem i jestem pewien , że nie mam żadnej nieskończonej pętli. Zastanawiam się czy nie dochodzi do jakiegoś zakleszczenia wątków (chociaż jawnie żadnego nie tworzę).

Metoda poszukująca klucz:

public void findProperSubstitutions(int x2, int y2)
	{
		// ax + b = x2
		// ay + b = y2
		
		int x,y;
		int g, m; // licznik i mianownik 
		x = y = -1;
		M26Arithmetic m26Artm = new M26Arithmetic();
		checkButton.setActionCommand("checkButton");
		checkButton.addActionListener(listener);
		
		for(int i=0; i<statistic.size(); i++)
		{
			for(int j=0; j<statistic.get(i).length; j++)
				x = statistic.get(i)[j] - 97;
			
			for(int j=0; j<statistic.size(); j++)
			{
				for(int k=0; k<statistic.get(j).length; k++)
				{	
					y = statistic.get(j)[k] - 97;
					if(y == x)
						continue;

					m = m26Artm.add(y, -x);
					g = m26Artm.add(y2, -x2);

					a = m26Artm.multiply(g, m26Artm.findReverse(m));
					b = m26Artm.add(x2, -m26Artm.multiply(a, x));

					if(m26Artm.areCoprimeIntegers(a, b))
					{
						System.out.println("Click");
						checkButton.doClick();
					}
				}
			}
		}
	}

Fragment klasy implementującej ActionListenera:

else if(aE.getActionCommand().equals("checkButton"))
		{
			System.out.println("Obsługa kliknięcia");
			txtArea.setText(affineCypher.decode(txtArea.getText(), breaker.a, breaker.b));
		}

Nie zrobiłem jeszcze panelu pytającego o poprawność dekodowania, ale skoro program nie działa to na razie nie ma po co dalej go rozbudowywać.

1

Zamiast "być pewnym". Odpal program pod debugerem i jak sie "zawiesi" to kliknij sobie w debugerze "pause" które przerwie ci wykonanie programu i pokaże gdzie program aktualnie "stoi" ;]

0

I Debuggerem mozesz ustawić sobie break pointy q miejscach kłopotliwych dla Twojego programu. Dodatkowym narzędziem jesr profiler, gdzie posprawdzasz między innymi gc, przepełnienia pamięci, przez zmienne, zachowanie wątków itd.
Jeszcze do głowy mi przyszło skorzystanie i wyłapanie błedów za pomoca try catch.

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