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

[JAVA] Dziwny problem z działaniem skanera

VPS Starter Arubacloud
0 głosów
274 wizyt
pytanie zadane 21 maja 2017 w Java przez embid123 Użytkownik (630 p.)

Witam, zamieszczę cały kod mojej klasy. 

import java.util.Scanner;

public class RozmieszczenieStatkow {
	
	Scanner skaner = new Scanner(System.in);
	int a, b;
	String poleGracza[][];
	boolean sprawdz;
	String tekst;
	
	public RozmieszczenieStatkow(String[][] poleGracza){
		super();
		this.poleGracza = poleGracza;
	}
	
	public String postawMaszt(String tekst){
		tekst = tekst.toUpperCase();
		a = (int)(tekst.charAt(0))-64;
		b = (int)tekst.charAt(1)-48;
		return poleGracza[a][b] = "X";
	}
	public void okretJednomasztowy(){
		
		do{
			sprawdz = false;
			System.out.println("Wybierz pole, na którym chcesz postawić maszt (np A1).");
			tekst = skaner.nextLine();
			a = (int)(tekst.charAt(0))-64;
			b = (int)tekst.charAt(1)-48;
			
			outerLoop:
			for(int i=a-2;i<=a+2;i++){
				for(int j=b-2; j<=j+2;j++){
					if(poleGracza[i][j].equals(null)){
						sprawdz = true;
					}
					else{
						sprawdz = false;
						break outerLoop;
					}
				}
			}
			
			if(sprawdz = false)
				System.out.println("Nie możesz w tym miejscu postawić masztu. ");
		}
		while(sprawdz == false);	
		
		postawMaszt(tekst);
		
	}
}

Problem polega na tym, że w metodzie okretJednomasztowy skaner łapczywie rzuca się na linijkę nie dając mi wpisać koordynatów, po czym wypluwa, że daję mu pustą linijkę. 

 

Konsola na to:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at RozmieszczenieStatkow.okretJednomasztowy(RozmieszczenieStatkow.java:27)
    at graWStatki.main(graWStatki.java:23)

 

Nie pierwszy raz mi się tak dzieje. W czym tu jest problem? 

komentarz 21 maja 2017 przez embid123 Użytkownik (630 p.)
Jak coś te zagnieżdżone pętle w metodzie okretJednomasztowy sprawdzają, czy wszystkie komórki dookoła tej wybranej są puste.
1
komentarz 21 maja 2017 przez Assasz Nałogowiec (30,460 p.)
W klasie zawierającej metodę main (czy tam innej, gdzie jest ta metoda wykonywana) jest zaimportowany scanner?
komentarz 21 maja 2017 przez embid123 Użytkownik (630 p.)
Nie ma, ale w jeszcze innej klasie na takiej samej zasadzie jak to wszystko działałao, tzn skaner w klasie zdefiniowany, w main brak, a działał
komentarz 21 maja 2017 przez embid123 Użytkownik (630 p.)

W sumie może wrzucę ten kod:

 

import java.util.Scanner;

public class Statki {

	public String poleGracza[][];
	public String poleCPU[][];

	private int a, b;
	
	
	public Statki(String poleGracza[][]) {
		super();
		this.poleGracza = poleGracza;
	}

	public String[][] wymiaryGracz() {

		Scanner skaner = new Scanner(System.in);
		int szerokosc = 0;
		int dlugosc = 0;
		int sprawdz = 0;
		do {
			if (sprawdz == 0) {
				System.out.println("Podaj długość planszy (liczba całkowita od 5 do 20). ");
			} else {
				System.out.println("Długość musi być liczbą całkowitą od 5 do 20! Podaj długość. ");
			}
			dlugosc = skaner.nextInt();
			sprawdz++;
		} while (dlugosc < 5 || dlugosc > 20);

		sprawdz = 0;
		do {
			if (sprawdz == 0) {
				System.out.println("Podaj szerokość planszy (liczba całkowita od 5 do 20). ");
			} else {
				System.out.println("Szerokość musi być liczbą całkowitą od 5 do 20! Podaj szerokość. ");
			}
			szerokosc = skaner.nextInt();
			sprawdz++;
		} while (szerokosc < 5 || szerokosc > 20);

		skaner.close();
		
		a = dlugosc + 1; //zapamietuję wymiary tablicy, by zdefiniować identyczną dla CPU
		b = szerokosc + 1;
		
		String poleGracza[][] = new String[a][b];

		
		return poleGracza;
		
	}//koniec wymiaryGracza
	
	public String[][] wymiaryCPU(){
		String poleCPU[][] = new String[a][b];
		return poleCPU;
	}//koniec wymiaryCPU
	
	public String[][] naglowkiTablicy(String poleGracza[][]){
		for (int i = 1; i < poleGracza.length; i++) {
			poleGracza[i][0] = Integer.toString(i);
		}
		for (int i = 1; i < poleGracza[0].length; i++) {
			poleGracza[0][i] = Character.toString((char) (64 + i));
		}
		
		for (int i = 0; i < poleGracza.length; i++) {
			for (int j = 0; j < poleGracza[0].length; j++) {
				if (poleGracza[i][j] == null) {
					poleGracza[i][j] = " ";
				}
				System.out.print(poleGracza[i][j] + "  ");
			}
			System.out.println();
		} 
		return poleGracza;
	}//koniec naglowkiTablicy
	

}//koniecKlasy

 

1
komentarz 21 maja 2017 przez Assasz Nałogowiec (30,460 p.)
Spróbuj usunąć skaner.close(). Bo jeśli po tej linii gdzieś tam używasz znowu skanera, to nie będzie działał, ponieważ zamykasz w ten sposób System.in stream.
1
komentarz 21 maja 2017 przez embid123 Użytkownik (630 p.)
Teraz działa, dzięki. :)

1 odpowiedź

+1 głos
odpowiedź 21 maja 2017 przez Wiciorny Ekspert (269,120 p.)

Moim zdaniem tak: biorąc pod uwagę, że pentla "do" wykonuje się zawsze 

Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at 

skaner nie szczytuje nic, ale zwraca false- wartość bool, natomiast ty parsujesz potem wartości na zmienne do int,

a boolean sparsowane do int bedzie  zatem można powiedzieć - że program uzna to za   "wpisanie danych" i dalsze działanie przebiega według "śmieciowych liczb' .

Miej to na uwadzę: SCANNER.NEXTline szczyta CI 1 linie

  System.out.println("cos tam \n .");

 

to jest pierwsza linia, wiec ... jakby dane juz szczytuje, natomiast spróbuj dać znak nowego wiersza po system print ln tak żeby znacznik przeszedł do następnego wiersza i potem czytaj scanerem 

 

Podobne pytania

0 głosów
1 odpowiedź 382 wizyt
pytanie zadane 11 grudnia 2018 w Java przez tiesto.ulic Obywatel (1,010 p.)
0 głosów
0 odpowiedzi 292 wizyt
pytanie zadane 4 czerwca 2018 w Java przez Artur313 Użytkownik (790 p.)
0 głosów
1 odpowiedź 1,241 wizyt
pytanie zadane 26 marca 2017 w Java przez BartekDataIT Użytkownik (770 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...