Pierwszy Scanner zawsze działa, drugi w innej klasie już nigdy nie działa

0

Mam taki problem jak w temacie. Nie potrafię znaleźć rozwiązania chociaż przeczytałem już chyba z 50 stron na stackoverflow. Zmieniłem nawet IDE, bo raz mi to pomogło na podobny problem (nie wiem dlaczego, wziąłem to za bug starego IDE).

package primitive.arena;
import java.util.Scanner;

public class PrimitiveArenaGame {
	public static void main(String[] args) {
		System.out.println("WITAJ W PROGRAMIE BATTLE ARENA!!!\n");
		Arena arena = new Arena();
		arena.project();
		System.out.println("WPROWADZ INT ZEBY WYCZYŚCIC");
		int xxx;
		try (Scanner scanner1 = new Scanner(System.in)) {
			xxx = scanner1.nextInt();
		}
		System.out.println("CZYSZCZENIE");
	}
}

xxx = scanner1.nextInt() nie działa, jest wyjątek java.util.NoSuchElementException. Od razu po komunikacie "WPROWADZ INT ZEBY WYCZYŚCIC", jeszcze nikt nic nie zdąży wprowadzić.
Wiem, że można zrobić if (scanner1.hasNextInt()), ale co mi to da? Program się nie wysypie, ale inta nie wczytam, a ja go chcę wczytać.
Problem jest w metodzie arena.project(), gdy ją zakomentuję, to mogę wczytać inta.
Metoda arena.project() wygląda tak:

	public void project(){
		System.out.println("Wpisz szerokosc areny...");
		int szerokosc, wysokosc;
		try (Scanner scanner = new Scanner(System.in)) {
			szerokosc = scanner.nextInt();
			System.out.println("Podaj wysokosc areny...");
			wysokosc = scanner.nextInt();
			System.out.println("EXCELLENT! A wiec wymiary areny to " + szerokosc + " na "+ wysokosc + ".");
		}
	}

I ona działa, inty się tu wczytują. Jak to jest, że drugi scanner nie działa, chociaż jest wszystko tak samo zrobione?

		try (Scanner scanner1 = new Scanner(System.in)) {
			xxx = scanner1.nextInt();
		}

		try (Scanner scanner = new Scanner(System.in)) {
			szerokosc = scanner.nextInt();
			wysokosc = scanner.nextInt();
		}

To samo? To samo!
Przemieściłem w mainie metodę arena.project() na koniec, czyli po System.out.println("CZYSZCZENIE");. Wtedy program kończy się tym samym wyjątkiem po System.out.println("Wpisz szerokosc areny...");

Wygląda jakby każdy scanner osobno działał, ale jak są po sobie w programie, to ten drugi sprawia problemy.

dodanie znaczników `` - furious programming

0

Zamykasz gdzieś Scanner?

0

Najpierw zamykałem, ale NetBeans mi kazał dawać do bloku try i nie zamykać. Zresztą jak zamykałem było to samo, to nie pierwszy mój program, w którym mam taki problem. W tutorialach to zawsze robią jeden Scanner w main() i zadowoleni, że im działa. Ale jak dodaję klasy ze Scannerami, to się sypie i nie wiem jak szukać wyjaśnienia tego.

0

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
ta odmiana try zamyka ci ten Scanner

Radzę zrobić w głównej klasie:
static Scanner sc=new Scanner(System.in);
w innych klasach posługiwać się PrimitiveArenaGame.sc.nextInt();

0

Zrobiłem z tym static Scanner. Teraz działa (przynajmniej na razie), ale o co najbardziej mi chodzi to dowiedzieć się dlaczego nie działało. Jeszcze przetestowałem wersję z arena.project() na końcu funkcji main() i niestety tu dalej jest NoSuchElementException. Dodatkowo w takim rozwiązaniu w każdej innej klasie ze skanerem muszę wpisać nazwę głównej klasy i nie będą to przenośne klasy.

0
JMad napisał(a):

Dodatkowo w takim rozwiązaniu w każdej innej klasie ze skanerem muszę wpisać nazwę głównej klasy i nie będą to przenośne klasy.

Co za problem, stwórz klasę tui (Text User Interface) w ktrórej zrób statyczny Scanner sc;
i odwołanie się wszędzie tui.sc.nextInt();

JMad napisał(a):

Jeszcze przetestowałem wersję z arena.project() na końcu funkcji main() i niestety tu dalej jest NoSuchElementException.

Wg kryształowej kuli błąd w wierszu 13.

0

Błąd mam zawsze tam gdzie jest pierwsze nexInt z drugiego w kolejności scannera.

0
JMad napisał(a):

Błąd mam zawsze tam gdzie jest pierwsze nexInt z drugiego w kolejności scannera.

A kryształowa kula zawsze wskazuje wiersz 13.

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