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

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)

0

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

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.

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ź.

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