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

Zamykanie Scanner

Object Storage Arubacloud
0 głosów
934 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ź 104 wizyt
pytanie zadane 4 maja 2020 w Java przez Schulz0123 Początkujący (330 p.)
0 głosów
1 odpowiedź 766 wizyt
pytanie zadane 21 lutego 2019 w Java przez Metarinda Użytkownik (740 p.)
0 głosów
0 odpowiedzi 825 wizyt
pytanie zadane 3 grudnia 2018 w Java przez MarioB Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...