• 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

Object Storage Arubacloud
0 głosów
281 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 (270,190 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ź 391 wizyt
pytanie zadane 11 grudnia 2018 w Java przez tiesto.ulic Obywatel (1,010 p.)
0 głosów
0 odpowiedzi 306 wizyt
pytanie zadane 4 czerwca 2018 w Java przez Artur313 Użytkownik (790 p.)
0 głosów
1 odpowiedź 1,249 wizyt
pytanie zadane 26 marca 2017 w Java przez BartekDataIT Użytkownik (770 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...