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

92,454 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!

...