Java - program się wysypuje z try-cactch

0

Witam. Zabrałem się za modyfikacje mojego starego kodu. Chciałem tylko dodać try-catch.

	while(czyNieTrafil)
			{
				System.out.println("Strzelaj! Wybierz pole!");
				
				try {
					
					
					if(tablica[strzal-1]==1)
					{
                        strzal=nowy.nextInt();
						System.out.println("Trafiony!");
						tablica[strzal-1]=0;
						++trafione;
					}
					else
					{
						System.out.println("Chybiłeś");
					}
					czyNieTrafil=false;
				} 
				catch (ArrayIndexOutOfBoundsException e) 
				{
					System.err.println("Tablica nie posiada tylu pól! ");
				}
				catch (InputMismatchException ae)
				{
					System.err.println("Zły typ danych, wprowadz liczbe calkowita :)");
				}
		
			} 

Kiedy wpiszę za dużą liczbę - wszystko ok, wyświetli się błąd, że tablica nie posiada tylu pól i użytkownik będzie mógł ponownie wpisać pole. Jeśli natomiast wpiszę zły typ danych (różny od inta) to program się wypisuje. Wyrzuca zapętloną w nieskończoność kombinacje:
n x "Strzelaj! Wybierz pole!"
n x "Zły typ danych, wprowadz liczbe calkowita :)"
n - liczba losowa.
Nie mam pojęcia jak to naprawić.

0

Jeśli wczytany zostaje zły typ (np. użytkownik poda abcd zamiast liczby), wskaźnik w buforze się nie przesuwa.

Innymi słowy: jeśli użytkownik podał abcd to po wykonaniu readInt() wciąż następne w kolejce do wczytania będzie abcd - to właśnie dzieje się u Ciebie. Możesz temu zapobiec wywołując nowy.next();: albo na zasadzie dodania komunikatu System.err.println(nowy.next() + " nie jest prawidłową liczbą.");, albo też po prostu wywołując nowy.next();.

0

Czyli po prostu cały czas wykonuje się w nieskończonej pętli (bo warunek nigdy nie będzie false)?

  1. System.out.println
  2. Pobieranie, bez późniejszej możliwości zmiany.
  3. Przypisanie tego co się pobrało
  4. Wyrzucenie błędu.

Czyli dane które wprowadzamy z klawiatury, najpierw są przechowywane w buforze, a dopiero potem zostaje zarezerwowany jakiś obszar pamięci dla nich? Czy bufor jest tym obszarem pamięci? I czy tak jest tylko z danymi wprowadzonymi z klawiatury, czy np przypisanymi podczas pisania też?

Uczyłem się z yt i w tutorialu, gościowi nie zwracał błędu. <--- 10:15.

0

Obejrzyj film jeszcze raz, uważnie.
Kod z filmu ma jedną usterkę, instrukcję skaner.close(). Jest ona do niczego niepotrzebna, a powoduje ogromne kłopoty w sekwencji:

Scanner skaner = new Scanner(System.in);
...
skaner.close();
...
skaner = new Scanner(System.in);
0

Ale skaner zostaje zamknięty dopiero na końcu programu. Nie wiem czemu miałoby to przeszkadzać. Sam w moim programie nie zamknąłem skanera i błąd wystąpił

0

Jaki błąd? IDE błędnie sugeruje aby zawsze zamykać Scanner. Ma to sens tylko gdy argumentem konstruktora Scannera jest plik. Nie ma sensu gdy argumentem jest klawiatura lub String.
Chodzi o to, żeby nie zamykać Scannera automatycznie. Unikniesz takiego błędu:

   ...
   someMethod();
   ...
   otherMethod();
   ... 
   void someMethod(){
      Scanner sc = new Scanner(System.in);
      ...
      sc.close();
   }
   ... 
   void otherMethod(){
      Scanner sc = new Scanner(System.in);
      ...
      sc.close();
   }
0

Aha, rozumiem już.

1
Scanner sc = new Scanner(System.in);

Metody czytające next, nextLine, nextInt, nextDouble zaczynają działać po naciśnięciu Enter.

  • nextLine czyta wszystko do Entera - bez Entera, ale usuwa Enter z bufora klawiatury,
  • next czyta wszystko do pierwszego białego znaku (spacja, tabulator, Enter) i niczego co jest dalej nie usuwa z bufora klawiatury,
  • nextInt sprawdza czy ciąg znaków przed pierwszym białym znakiem da się przekonwertować na liczbę typu int, jeśli się da, to pobiera go z klawiatury i konwertuje, jeśli się nie da, to rzuca wyjątkiem i zostawia wszystko w buforze klawiatury.

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