• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java problem z Timertask, błąd BufferOverflowException

Object Storage Arubacloud
0 głosów
213 wizyt
pytanie zadane 6 maja 2019 w Java przez PawelTSW90 Nowicjusz (120 p.)

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. Pojawił się problem którego nie mogę rozwiązać, w linii 1014 stworzyłem metodę która ma odliczać czas na udzielenie prawidłowej odpowiedzi. W przypadku nieprawidłowej odpowiedzi, kod przenosi się do linii 1177, gdy minie 7 sekund dzieje się to samo. Jeśli wpiszę nieprawidłową liczbę, wszystko jest w porządku, nie ma problemu z kodem. Natomiast jeśli minie ustalony czas, następna metoda działa prawidłowo, natomiast kolejna, gdzie pojawia się UserInput(linia 1244) przy jakiejkolwiek odpowiedzi wyskakuje błąd BufferOverflowException. Proszę o pomoc! Załączam link:

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

 

2 odpowiedzi

0 głosów
odpowiedź 7 maja 2019 przez Arkadiusz Fajdek Dyskutant (9,450 p.)
O stary ^_^. Dobra postaram dać Ci kilka rad. od razu mówię że to wszystko co napiszę nie rozwiąże twojego problemu, ale być może pomorze go zidentyfikować.

1) Po pierwsze, trzymanie wszystkiego w jednej klasie to bardzo zły pomysł. Musisz rozbić kod na dużo mniejsze kawałki. Musisz stworzyć klasy które będą odpowiedzialne za jeden wybrany obszar. Dzięki temu pozbędziesz się duplikatów. Całość będzie mniejsza. I będzie dużo łatwiej przeglądać kod.

2) Czy ja dobrze widzę że w metodzie dol() jest rekruencja? Rekurencja oznacza ze metoda wywołuje samą siebie. zauważ co się dzieje jeśli będzie wybór 3, w linii 1312 wywołujesz dol(), a niżej po wyjściu z metody znów robisz dol() linia 1315, później masz linia 1317 ktora sprawdza ten sam warunek (?!) i znów masz pełno rekurencji.

Na moje oko to po prostu się zapętlasz gdzieś bo ciągle wywołujesz tą samą metodę.
komentarz 7 maja 2019 przez PawelTSW90 Nowicjusz (120 p.)
Dziękuję za odpowiedź! Jeśli chodzi o sam kod to wiem że fatalnie to wygląda, ale tak jak wspomniałem ukończyłem jedynie 4 kilkuminutowe lekcje omawiające UserInput, if/else if i for. Tak naprawdę wogóle na tym etapie nie powinienem się za coś takiego brać no ale nie mogłem się powstrzymać i wyszło to co wyszło:) Jeśli chodzi o rekurencje to tak celowo je zrobiłem i występują chyba w prawie połowie metod w kodzie, a wynika to po prostu z mojej niewiedzy, bo chciałem aby przy sprawdzaniu statystyk gracza, gra po chwili wracała do początku metody z której ta statystyka została wywołana. Nie wiedziałem jak to inaczej zrobić. Pewnie jest na to banalny sposób. Podobnie jeśli gracz wybierze inny numer opcji wyboru niż jest podana to gra automatycznie też zaczyna metode od nowa. Jeśli chodzi o wywołanie "Dół" to faktycznie było chyba o jedną za dużo i ja usunąłem:) Ale jestem w 99% pewien że problem leży w Timerze. Linia 1082 zaczyna krótą zręcznościówke w której trzeba wpisać w przeciągu 7 sekund podaną liczbę, przy dobrej próbie mamy następną i tak chyba z 5 razy. W przypadku podania wszystkich liczb prawidłowo, kieruje nas do metody "dół" i tam wszystko działa jak należy. Jeśli wpiszemy złą liczbę w przeciągu 7 sekund, kieruje nas do metody "upadek" a następnie również "dół" i w tym przypadku tak samo wszystko działa jak należy. Natomiast jeśli nie zmieścimy się w 7 sekundach, kieruje nas tak samo na "upadek" i "dół" jak przy podaniu złej liczby, wszystkie kroki są identyczne. A jednak przy trzeciej możliwości kiedy pojawia się user input w metodzie "Dół" i wpiszemy cokolwiek to wyskakuje błąd BufferOverflowException. Przy pozostałych możliwościach nie ma z UserInput problemu. Więc wydaje mi se że jeśli minie 7 sekund coś dzieje się z Timerem co powoduje ten błąd. Gdybyś miał cierpliwość odpalić kod i sprawdzić to wystarczy że wpiszesz Dół gdy gra pyta o imie i automatycznie przekierowuje do omawianego momentu. Jeśli nie, to i tak dziękuję za odpowiedź! Pozdrawiam!
komentarz 7 maja 2019 przez Arkadiusz Fajdek Dyskutant (9,450 p.)

Po pierwsze, mega szacun że Ci się chciało, widać że masz zapał. Ściągnąłem kod, uruchomiłem, jednak nie mogę odtworzyć opisanej przez Ciebie sytuacji.

Jednak musisz się na chwilę zatrzymać. Chociaż pomysł jest ogólnie spoko, i naprawdę miałem uśmiech na twarzy jak odpaliłem kod i zaczęła się gra! (jeszcze raz, masz super zapał)

Musisz to wszystko przerobić, jest to napisane po prostu źle, nie będziesz w stanie tego utrzymać, a w przypadku błędu jest tu tyle rekurencji że się człowiek w tym nie połapie.

Musisz to wszystko rozbić, na małe kawałki które będą odpowiadać za jedną i tylko jedną rzecz.

Nie dam rady siedzieć i przeglądać ponad 1000 linii, sorka - ale w weekend być może znajdę czas żeby przerobić to mniej więcej tak jak to powinno wyglądać. Odezwij się w sobotę na PW to możemy coś podziałać. W międzyczasie zaproszę Cie na mojego bloga: https://technologicznasowa.pl/ piszę tam właśnie mały kurs dla osób zaczynających swoją przygodę z Javą :)

komentarz 7 maja 2019 przez PawelTSW90 Nowicjusz (120 p.)
Nie przejmuj się nie ma co tutaj się meczyć i kombinować z naprawą, to tylko moje pierwsze większa bazgroły będe miał kiedyś na pamiątkę jak zaczynałem:) Spróbuje zastąpić timer w inny sposób bo na razie chyba za wcześnie dla mnie. Pozdrawiam i dzięki za zaproszenie!
0 głosów
odpowiedź 10 maja 2019 przez Huberto Początkujący (340 p.)
Paweł, dobrze, że piszesz od samego początku, bo to nauczy cię najwięcej ale radzę nie pisać aż tak rozbudowanych programów, bo to tylko komplikuje sprawę. Niby ponad 1300 linii kodu ale 3/4 to println'y z tekstem i same if'y gdzie lepsze byłyby np. switch'e.

Lepiej na to konto rozwiązywać zadania ze SPOJ'a. Niby kilka linijek którymi ciężko się pochwalić ale ile daje to logicznego myślenia i abstrakcji w przeciwieństwie do masy zagnieżdżonych if'ów. W twoim programie jest zero obiektowości ;) Ćwicz ale na czymś mniejszym, bo ta gra choć fajna to ciężka w rozbudowie i w wyszukiwaniu błędów. Mi się wysypała w kilku dziwnych miejscach innych niż wspomniałeś ;)
komentarz 10 maja 2019 przez PawelTSW90 Nowicjusz (120 p.)
Dzieki za komentarz:) zgadza sie gdyby nie println to ten kod mialby polowe albo i mniej linijek. Do switchow jeszcze nie doszedlem w kursie, zrobilem tylko if/else if i for i postanowilem zrobic gre:) jak tylko to skoncze to juz nie bede sie pchal na cos co mnie przerasta. Na szczescie z bledem pomogl kuzyn informatyk. Okazalo sie ze problemem byl ten sam scanner dla glownego programu i Timertaska, wystarczylo stworzyc drugi osobny. Pozdrawiam!

Podobne pytania

0 głosów
1 odpowiedź 397 wizyt
pytanie zadane 4 maja 2018 w Java przez Paweł Celuch Początkujący (420 p.)
+1 głos
1 odpowiedź 252 wizyt
pytanie zadane 20 kwietnia 2018 w Java przez neos Początkujący (320 p.)
0 głosów
1 odpowiedź 353 wizyt
pytanie zadane 4 maja 2016 w Java przez DeBos123 Nałogowiec (44,950 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...