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

[JAVA] Błąd przy użytkowaniu skanera.

VPS Starter Arubacloud
+1 głos
808 wizyt
pytanie zadane 30 kwietnia 2017 w Java przez embid123 Użytkownik (630 p.)

Witam, próbuję wprowadzić wartości dla obiektów typu String przy pomocy skanera. Składniowo wszystko gra, niemniej jednak wyskakuje mi błąd w konsoli. 

int a;
		int b;
		String pamietajWyraz;
		
		Scanner skaner = new Scanner(System.in);
		
		System.out.println("Podaj wiadomość do zaszyfrowania. ");
		
		pamietajWyraz = skaner.nextLine();
		
		System.out.println("Podaj ilość kolumn. ");
		
		b = skaner.nextInt();
		
		skaner.close();
		
		String pousuwaj = ". ,:;!?()-/~`[]{}|+_*&^%$#@";
		
		for(int i=0; i<pamietajWyraz.length(); i++){
			for(int j=0; j<pousuwaj.length(); j++){
				if (pousuwaj.charAt(j)==pamietajWyraz.charAt(i)){
					pamietajWyraz = pamietajWyraz.replace(Character.toString(pamietajWyraz.charAt(i)), "");
					i--;
				}
					
			}
			
		}
		pamietajWyraz = pamietajWyraz.toLowerCase();
		System.out.println(pamietajWyraz);
		
		System.out.println("Długość słowa: " + pamietajWyraz.length());
		
		a=pamietajWyraz.length()/b+1;
		
		System.out.println("Klucz: " + a + ", " + b);
		
		char tab[][] = new char [a][b];
		
		int aktualnyIndeks = 0;
		
		for(int i=0; i<tab.length; i++){
			for(int j=0; j<tab[0].length; j++){
				if(aktualnyIndeks<pamietajWyraz.length()){	
				tab[i][j] = pamietajWyraz.charAt(aktualnyIndeks);
				System.out.print(tab[i][j] + " ");
				aktualnyIndeks++;
				} else {
					tab[i][j] = pousuwaj.charAt(1);
				}
			}
			System.out.println();
		}
		String zaszyfrowanaWiadomosc = "";
		for(int i=0; i<tab[0].length; i++){
			for(int j=0; j<tab.length; j++){
				zaszyfrowanaWiadomosc+=Character.toString(tab[j][i]);
			}
				}
		System.out.println(zaszyfrowanaWiadomosc);
		
		/* częśćB */
		System.out.println("\n Część B \n");
		
		Scanner skaner2 = new Scanner(System.in);
		
		String klucz;
		String zaszyfrowanaWiadomosc2;
		
		System.out.println("Podaj zaszyfrowaną informację. ");
		zaszyfrowanaWiadomosc2 = skaner2.nextLine();
		
		System.out.println("Podaj klucz (a, b)");
		klucz = skaner2.nextLine();
		
		skaner2.close();
		

Błąd wygląda tak: 

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at Zad3.main(Zad3.java:77) - linijka użycia skanera skaner2 po raz pierwszy. 

komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
Dodam, że gdy nie zamknę obiektu skaner i będę z niego korzystał przy wpisywaniu trzeciej i czwartej wartości dla obiektu (to w części B), wyświetla mi:

 Podaj zaszyfrowaną informację.
Podaj klucz (a, b)
14, 5

Pomija etap, w którym użytkownik dodaje zaszyfrowaną informację
komentarz 30 kwietnia 2017 przez Wildee Gaduła (3,380 p.)
Wrzuć cały kod, bo ciężko mi cokolwiek z tego odczytać ;)
komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
To jest do tej pory cały kod, tylko wrzucić to w main.

4 odpowiedzi

+1 głos
odpowiedź 30 kwietnia 2017 przez Wildee Gaduła (3,380 p.)

Spróbuj zamiast Scanner użyć BufferedReader. Powinno działać :) Dorzuciłem również przykład, jak zamienić String w int. Śmiało pytaj, jakbyś czegoś nie rozumiał :)
 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

BufferedReader skaner = new BufferedReader(new InputStreamReader(System.in));

pamietajWyraz = skaner.readLine();
b = Integer.parseInt(skaner.readLine());
komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
pamietajWyraz = skaner.readLine();- dzięki temu po wpisaniu w konsolę powiedzmy "coś" , moja zmienna przybiera wartość "coś" tak?
komentarz 30 kwietnia 2017 przez Wildee Gaduła (3,380 p.)
Tak, dokładnie :)
komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
Wszystko z Twojego kodu już rozumiem, dzięki za pomoc. ;)
+1 głos
odpowiedź 30 kwietnia 2017 przez Ghost Bywalec (2,930 p.)
Część b jak umieścisz w innej metodzie to działa wszystko.
+1 głos
odpowiedź 30 kwietnia 2017 przez Codeboy Stary wyjadacz (12,120 p.)

Obydwa scannery używają tego samego InputStream z którego pobierają dane. Kiedy zamykasz pierwszy, drugi nie ma już do tego dostępu w wyniku czego dostajesz NoSuchElementException.

Możesz zamknąć go na końcu razem z drugim i będzie działać, ale nie powinno się chyba otwierać dwóch skanerów jeden po drugim. Zresztą to i tak nie ma sensu. Po co Ci dwa? Użyj jednego obiektu Scanner i zamknij kiedy przestaniesz z nim pracować, po prostu .

komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)

Próbowałem tak zrobić. 

wpisywałem 

System.out.println("podaj coś1");
zmienna1 = skaner.nextLine();

System.out.println("podaj coś2");
zmienna2 = skaner.nextLine();

wyświetlenie w konsoli wyglądało tak:

podaj coś1
podaj coś 2
(tu mogłem wpisac wartość dla coś2)

ogólnie, pomijało mi podanie wartości dla zmiennej 1, o to się rozchodziło

komentarz 30 kwietnia 2017 przez Codeboy Stary wyjadacz (12,120 p.)

Co ty gadasz :O To jest nie możliwe żeby pomijało nextline().
I sprawdzałem twój kod z jednym scannerem, wszystko 4 skany prawidłowo odczytywał.

komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
Też się zdziwiłem, teraz piszę części A i B w 2 osobnych klasach i wszystko hula jak należy. :)
komentarz 30 kwietnia 2017 przez Codeboy Stary wyjadacz (12,120 p.)
Ale tam naprawdę nie mogło tak być, musiałeś coś innego popsuć ;)
komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
Możliwe, że coś innego leżało. Jednak wpis w konsoli odnosił się do nextLine()... Mniejsza już zresztą, ważne że już działa. :)
komentarz 30 kwietnia 2017 przez Codeboy Stary wyjadacz (12,120 p.)
Ta, "ważne, że działa" :D
0 głosów
odpowiedź 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)

Żeby nie robić zbędnego bałaganu, napisze tu. 

 

import java.util.Scanner;

public class Zad3b {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* częśćB */	
		Scanner skaner = new Scanner(System.in);
		
		String klucz;
		String zaszyfrowanaWiadomosc;
		
		System.out.println("Podaj zaszyfrowaną informację. ");
		zaszyfrowanaWiadomosc = skaner.nextLine();
		
		System.out.println("Podaj klucz (a, b)");
		klucz = skaner.nextLine();
		
		skaner.close();
		String przecinek = ",";
		String przechowajA = "";
		String przechowajB = "";
		int a=0;
		int b=0;
		
		for(int i=0; i<klucz.length(); i++){
			if(klucz.charAt(i) == przecinek.charAt(0)){
				przechowajA = klucz.substring(0, i);
				przechowajB = klucz.substring(i+1, klucz.length());
			}
		}
		System.out.println("Wartości Stringowe zmiennych: " + przechowajA + ' ' + przechowajB);
		
		int pomoc = 1;
		
		for (int i = 0; i < przechowajA.length(); i++) {
			a+=Character.getNumericValue(przechowajA.charAt(przechowajA.length()-1-i))*pomoc;
			System.out.println("Wyznaczanie a w pętli:" + a);
			pomoc*=10;
		}
		pomoc=1;
		for (int i = 0; i < przechowajB.length(); i++) {
			b+=Character.getNumericValue(przechowajB.charAt(przechowajB.length()-1-i))*pomoc;
			System.out.println("Wyznaczanie b w pętli: " + b);
			pomoc*=10;
		}
	
		System.out.println("Wartości intowe zmiennych: " + a + " " + b);
	}

}

Wiem, że to dość dziwny kod to przekształcenia String w int, ale dziwi mnie jedna rzecz. Po odpaleniu tego w konsoli:

Podaj zaszyfrowaną informację. 
coś
Podaj klucz (a, b)
123, 987
Wartości Stringowe zmiennych: 123  987
Wyznaczanie a w pętli:3
Wyznaczanie a w pętli:23
Wyznaczanie a w pętli:123
Wyznaczanie b w pętli: 7
Wyznaczanie b w pętli: 87
Wyznaczanie b w pętli: 987
Wyznaczanie b w pętli: -13
Wartości intowe zmiennych: 123 -13
 

Dlaczego wartość B wyświetlana w pętli (jako już intowa), poza pętlą jest 1000 mniejsza? 

komentarz 30 kwietnia 2017 przez embid123 Użytkownik (630 p.)
Dobra znalazłem błąd- spację na końcu.

Podobne pytania

0 głosów
1 odpowiedź 176 wizyt
0 głosów
2 odpowiedzi 2,464 wizyt
pytanie zadane 20 czerwca 2017 w Java przez agigi1988 Nowicjusz (190 p.)
0 głosów
2 odpowiedzi 311 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

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

...