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

Zamykanie Scanner

VPS Starter Arubacloud
0 głosów
1,067 wizyt
pytanie zadane 23 października 2016 w Java przez pawelgp Początkujący (350 p.)
Dzień dobry.

String imie = new Scanner(System.in).nextLine();

lub

int x = new Scanner(System.in).nextInt();

Czy to jest zły zapis, bo jeśli nie, to czy da radę zamknąć Scanner, a jeśli tak, to dlaczego?

W eclipse musiałem dodać: @SuppressWarnings("resource") i poszło, ale spoj zgłasza NZEC.

1 odpowiedź

+7 głosów
odpowiedź 23 października 2016 przez ShiroUmizake Nałogowiec (46,300 p.)

Utworzyłeś instacje klasy String . a następnie przepisałeś mu konstruktor Scanner i wyłowałeś metodę nextLine . Ok, to działa, ale zauważ jedną rzecz, jeżeli spróbujesz wyłować w imie.nextInt() np: wyrzuci Ci błąd, gdyż imię jest String. Inaczej rzecz ujmując, dojdzie do błędnej konwersji danych i ta zmienna będzie mogła przejmować tylko String. Owszem, możesz stworzyć kolejnego scannera. Jednakże, jeżeli będziesz wywoływał kolejne Scannery to zajmowany obszar pamięci będzie coraz większy (Owszem, garbage_colector sobie jakoś poradzi, ale po co wywoływać go bez sensu jak można uniknąć tą usterkę).

Poprawniej powinno być

Scanner input = new Scaner(System.in);
int x = Scanner.nextInt();
String imie = Scanner.nextLine();
input.close();

Tym sposobem, uruchomiłem tylko raz Scanner i odwołuje się do jego metod. Przez co mniej pamięci zje.

Zauważ kolejną rzecz:

String imie = new Scanner(System.in).nextLine();
imie.close(); // Tu będzie błąd.

Dlaczego? Linijke wcześniej , zrobiłeś tzw. jawne wyłowanie konstruktora i metody. I zostało to przepisane do obiektu imię o klasie String, ale... metoda close już nie. Przez co JAVA rzuci wyjątek, dude ten obiekt nie ma takiej metody. Po drugie , jeżeli wywołujemy w ten sposób:

int C = UtworzonaKlasa.getC();

To spodziewamy, się , że obiekt UtworzonaKlasa o klasie UtworzonaKlasa , pobierze z prywatnego pola o nazwie C i o typie int. 

A co ma zwracać metoda close ??

imie = new Scanner(System.in).close(); // Tu również będzie błąd.

Dlaczego? Bo close i jest void. A JAVA spodziewa się, że metoda close zwróci nam jakiś String.

To dlaczego to jest poprawny zapis?

Scanner input = new Scanner(System.in);
input.close();

Ten obiekt nazywa się input o typie Scanner , którego konstruktorem jest Scanner. Mówiąc inaczej, kazaliśmy JAVIE. Utwórz mi obiekt Input o klasie Scanner i przepisz mu wszystkie metody i pola , konstruowane przez Scannera. Dlatego teraz mogę, zamknąć Scannera. Bo JAVA wie, że ma patrzeć na obszar pamieći w której jest Scanner i znależć tam metodę close.

 

komentarz 23 października 2016 przez pawelgp Początkujący (350 p.)

Dziękuję. Mam małe dodatkowe pytanie, czy można raz utworzyć jeden skaner i używać go do odczytywania różnych zmiennych, by na końcu go zamknąć, a nie za każdym razem robic to od nowa?

Scanner input = new Scanner(System.in);
String imie = input.nextLine();
String nazwisko = input.nextLine();
int wiek = input.nextInt();
// itd...?
input.close();

 

1
komentarz 23 października 2016 przez Javowiec Pasjonat (21,560 p.)
Można, a nawet jest to wskazane.

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 4 maja 2020 w Java przez Schulz0123 Początkujący (330 p.)
0 głosów
1 odpowiedź 792 wizyt
pytanie zadane 21 lutego 2019 w Java przez Metarinda Użytkownik (740 p.)
0 głosów
0 odpowiedzi 911 wizyt
pytanie zadane 3 grudnia 2018 w Java przez MarioB Nowicjusz (120 p.)

92,964 zapytań

141,930 odpowiedzi

321,162 komentarzy

62,298 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...