Problem z przejściem z metody z throws InterruptedException do metody bez throws InterruptedException

0

Witam, z góry chciałem uprzedzić że jestem początkującym z Javą, uczą sie z kursu online i na razie przerobiłem jedynie lekcje uczące wykorzystywania UserInput,/if-else/if, for. Na podstawie tego postanowiłem napisać prostą grę tekstową. Uprzedzam więc że kod jest prymitywny. Wszystkie przejścia między metodami szły dobrze(wszystkie używaja Throws InterruptedException bo wykorzystuje bardzo dużo funkcji Thread.sleep). Problem pojawił się gdy musiałem użyć pierwszy raz metody bez Throws InterruptedException. Udaje mi się przejśc z tej metody (upadek)do metody z ThrowsInterruptedException(dol) ale jest tam UserInput i przy próbie wpisania wyskakuje błąd "BufferOverflowException". Dodam że gdy pominąłem metode bez Throws InterruptedException(upadek) to wszystko działa jak należy, więc problem leży gdzieś w niej. Zamieszczam screen z obydwiema metodami aby rozjaśnić sytuację. Z góry dziękuję za pomoc!

0

Przeanalizuj stracktrace. Pokaż swój kod w obrębie linii 1086.

0

Przy okazji - wyrabiaj nawyk anglojęzycznego nazewnictwa ;)

0
kixe52 napisał(a):

Przeanalizuj stracktrace. Pokaż swój kod w obrębie linii 1086.

Przed metodą"upadek" mam metodę z Timerem, gdzie szybko trzeba wprowadzić podane liczby. Gdy wprowadzi się złą, kieruje do metody "upadek". Gdy minie 7 sekund, też kieruje do tej metody. Jeśli wprowadzi się dobrą, timer się resetuje, pojawia się nowa liczba i liczy od nowa.

0

Oczywiście mogę się mylić, ale problem może leżeć w tym ze używasz w swoim kodzie metod wielowątkowych. Używasz też scannera do pobierania wartości od usera. Prawdopodobnie występuje tutaj tzw Race Condition. Nie widzę całego kodu, bo go nie wrzuciłeś na gita, ale obstawiam, że gdzieś w kodzie próbujesz uzyskać od usera jedną wartość kilkoma wątkami na raz.

0
kixe52 napisał(a):

Przeanalizuj stracktrace. Pokaż swój kod w obrębie linii 1086.

Odkryłem właśnie ze problem nie występuje gdy w poprzedniej metodzie wpisze złą liczbę przy odliczaniu, a jedynie kiedy minie ustalone 7 sekund. Więc problem prawdopodobnie leży gdzieś w załączonej na screenie metodzie z Timertask. Wydaje mi się że to przez to że w przypadku odczekania 7 sekund nie zatrzymałem TimerTask przez wpisanie odliczanie.cancel, tak jak to zrobiłem przy wpisaniu złej liczby. Natomiast tutaj nie wiem w jaki sposób odliczanie zatrzymać.

Belka napisał(a):

Przy okazji - wyrabiaj nawyk anglojęzycznego nazewnictwa ;)

Dzieki za radę, faktycznie powinienem zwłaszcza że aktualnie mieszkam w Anglii i to tutaj chciałbym spróbować Java juniora:)

https://gist.github.com/PawelTSW90/8e79c9f7633e47b69f191461a8aeb3b8

Wrzucam link.

Linia 1014 - Metoda z Timertask
Linia 1244 - Metoda w której występuje błąd przy UserInput

1

Ponad 1000 linii?!
Ponad 1000 linii jednej klasy to czyste zło. Czyste.
Kod nie wygląda dobrze.
Jest źle. Informuję wprost.
Do przerobienia tego kodu będzie potrzeba dosyć dużo czasu, tak, żeby był zgodny z konwencją, clean code, zasadami KISS, DRY, SOLID, YAGNI...
Jak skończysz projekt (stawiam, że to jest chwilowo Twoim celem) naucz się tworzyć klasy. Zobacz dlaczego się je tworzy i jak się z nich korzysta. Potem podział na pakiety.

0

@Paweł Dyjak jest tu dużo rzeczy, które trzeba ogarnąć, zanim przejdziemy do głównego problemu.

  1. Wrzuć kod na githuba albo gitlaba. Łatwiej będzie go omawiać, cytować, linkować i ułatwisz nam pracę (pomoc tobie).
  2. Nazywaj rzeczy po angielsku. Niby nie ma przymusu, ale dobre nawyki pozostaną. Poprawne nazywanie rzeczy jest jedną z najtrudniejszych do opanowania umiejętności w programowaniu.
  3. Wchodzisz mocno w wielowątkowość na bardzo niskim poziomie. To trudne zagadnienie. Zastanów się nad prostszym rozwiązaniem. Może jednowątkowa pętla główna programu?
0

Dziękuję za wszystkie rady, tak jak pisałem jestem tylko po czterech 6-minutowych lekcjach z Userinput i if/else if/for, wiec tak naprawde w ogóle nie powinienem się za coś takiego brać, no ale nie mogłem sie powstrzymać i wyszło jak wyszło:) Wygląda na to że problem pozostanie nie rozwiązany więc po prostu zrezygnuje z Timera. Pozdrawiam!

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