Java String

Witam,

może zabrzmi to śmiesznie, bo mój problem pewnie jest błahy do rozwiązania. Polega on na tym, że kiedy chcę przypisać do zmiennych String (wartości są podane przez użytkownika) ciąg znaków który zawiera spację, to w zmiennej znajduje się tylko ciąg do spacji, natomiast spacja i to co się za nią znajduje nie zostaje zapisane do zmiennej. Do pobierania wartości do String używam klasy Scanner

Nie jestem ekspertem od Javy, ale wygląda na to, że Scanner dzieli wejście po białych znakach, co potwierdza dokumentacja - https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

Jeśli chcesz pobrać dokładnie to co wpisuje użytkownik powinieneś pewnie użyć innej metody, albo odpowiedni skonfigurować Scanner.

Niestety Java ma tę cechę, że niepotrzebnie utrudnia rzeczy, które powinny być proste jak budowa cepa. Oczywiście jak ma się doświadczenie, to się na to nie zwraca uwagi, ale dla początkujących jest to frustrujące. Dla porównania w C# jest po prostu Console.ReadLine();

Java też to miała, DataInputStream + readLine() , miała, bo nie wiem czy właśnie Scanner tego nie zastąpił (kilka lat temu się “uczyłem” :slight_smile:

W Java od wersji 1.6 też jest Console#readLine(), która wczytuje linię z konsoli: https://docs.oracle.com/javase/6/docs/api/java/io/Console.html.

Nie wiem jak w C#, ale w Java jest zasadnicza różnica między Console a Scannerem. Obiekt console nie może zostać pobrany, jeżeli proces Javy nie został uruchomiony w trybie konsolowym/tekstowym tak, że z daną instancją mamy skojarzoną konsolę. Przykładowo jeżeli będziemy póbowali to wywołać z poziomu IDE z pseudoterminala to takowej konsoli nie ma. Metoda System.console(), w takim przypadku zwróci null.

If this virtual machine has a console then it is represented by a unique instance of this class which can be obtained by invoking the System.console() method. If no console device is available then an invocation of that method will return null.

Scanner natomiast nie jest warstwą abstrakcji nad niskopoziomowym API terminal device zależnym od systemu. Jego użycie jest też proste i można wczytać nim całą linię z dowolnego strumienia, np. standardowego wejściam, przykład na ideone: https://ideone.com/SoC7wP

System.out.println("Enter some string: ");
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
System.out.println("This is string: " + string);

Wydaje mi się, że metoda na tej klasie jest dostępna od początku jej istnienia, czyli wersji 1.5

1 polubienie

Problem rozwiązany, dziękuję :slight_smile: