• 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.

Object Storage Arubacloud
+1 głos
835 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ź 180 wizyt
0 głosów
2 odpowiedzi 2,529 wizyt
pytanie zadane 20 czerwca 2017 w Java przez agigi1988 Nowicjusz (190 p.)
0 głosów
2 odpowiedzi 315 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...