błąd dotyczący java.util.Scanner

Odpowiedz Nowy wątek
2015-01-08 20:47
0

Witam wszystkich.

Aktualnie jestem na etapie nauki podstaw javy i wczoraj napotkałem błąd w moim prostym programie. Jednak po 30 min udało mi się go wyeliminować.
Jednak chciałbym z ciekawości dowiedzieć się dlaczego taki błąd się pojawia.

(Na wstępie uprzedzam że to mój pierwszy post, więc zapewne będzie mało "profesjonalny ;) )

Sytuacja wygląda następująco. (Dla pokazania błędu napisałem najprostszy przykład)


import java.util.Scanner;

public class Test {

    public static void exampleA()
    {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
    }

    public static void exampleB()
    {
        Scanner skan = new Scanner(System.in);
        String s = skan.nextLine();
    }

    public static void exampleC()
    {
        Scanner sk = new Scanner(System.in);
        String s = sk.nextLine();
        sk.close();

    }

    public static void exampleD()
    {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        sc.close();

    }

Teraz wywołując w funkcji main funkcje exampleC() i exampleD() (jak poniżej)


    public static void main(String[] args) {
        exampleC();
        exampleD();     
    }

}   

pojawi się następujący błąd podczas wykonywania programu

"Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at Test.exampleD(Test.java:29)
at Test.main(Test.java:37)
"

...
Natomiast jeśli wywołamy w funkcji main funkcję exampleA() i exampleB() (jak poniżej) program wykona się prawidłowo


public static void main(String[] args) {
        exampleA();
        exampleB();     
    }

}

Teraz moje pytanie. Dlaczego tak się dzieje? Kompilator sam informuje mnie żebym zamknął obiekt Scanner po użyciu. A gdy go zamknę tak jak prosi (exampleC() i exampleD() ) to wtedy jednak program napotyka błąd podczas wykonywania.
Mógłby mi ktoś powiedzieć dlaczego?

(nie wiem czy dobrze opisałem o co mi chodzi ale z góry dzięki za odp)

edytowany 3x, ostatnio: bogdans, 2015-01-08 21:41
!Wstawiaj kod w znaczniki <code=java></code> - bogdans 2015-01-08 21:42

Pozostało 580 znaków

2015-01-08 21:48
0

kompilator? chyba IDE. to nie zamykaj, bądź mądrzejszy od IDE


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!

Pozostało 580 znaków

2015-01-08 21:49
2

W klasie Scanner jest kilka konstruktorów, między innymi

Scanner(new File("...") );
Scanner("abc hhhh");
Scanner(System.in);

Zamknąć powinno się ten pierwszy, przy drugim jest wszystko jedno, przy trzecim nie powinno się zamykać.
Pewne IDE są mało subtelne i zawsze sugerują zamykanie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-08 23:25
0

oczywiście chodziło o IDE. dzięki za poprawienie. ;)

ok. będę pamiętał by Scanner(System.in) nie zamykać ;]. dzięki za odpowiedź.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0