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

Odpowiedz Nowy wątek
2019-05-06 15:46
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!

  • 2.jpg (0,51 MB) - ściągnięć: 19
  • 1.jpg (0,41 MB) - ściągnięć: 17

Pozostało 580 znaków

2019-05-06 15:55
0

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

Pozostało 580 znaków

2019-05-06 16:07
0

Przy okazji - wyrabiaj nawyk anglojęzycznego nazewnictwa ;)

Pozostało 580 znaków

2019-05-06 16:12
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.

  • 3.png (0,2 MB) - ściągnięć: 16

Pozostało 580 znaków

2019-05-06 16:38
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.

Pozostało 580 znaków

2019-05-06 16:43
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/Pawel[...]9c9f7633e47b69f191461a8aeb3b8

Wrzucam link.

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

  • 4.jpg (0,18 MB) - ściągnięć: 6
edytowany 1x, ostatnio: Koziołek, 2019-05-06 22:36

Pozostało 580 znaków

2019-05-06 21:46
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.


Pozostało 580 znaków

2019-05-06 22:40
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?

Pozostało 580 znaków

2019-05-07 19:14
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!

Wiesz, problemem jest to, że ten kod jest w takich ilościach i tak okropnym stanie, że mała szansa, że komuś postronnemu będzie się chciało go całego analizować. Tak jak pisałem, obstawiam że to przez wielowątkowość. Jeśli jesteś na początku nauki, to zajmij się pętlami, tablicami, obiektowością, kolekcjami, wyjątkami itp. Wątki zostaw na "koniec". Poczytaj o zasadach czystego kodu w javie, pisaniu w kilku klasach / plikach etc. - kixe52 2019-05-07 19:36

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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