IO流要“晚开早关”,Scanner对象也有close()方法,为什么总是无人问津呢? 
 
[Java] 纯文本查看 复制代码 import java.util.Scanner;
public class ScannerQuestion1 {
	public static void main(String[] args) throws Exception {
		Scanner sc1 = new Scanner(System.in);
		System.out.println("输入任意字符串:");
		String s = sc1.nextLine();
		System.out.println(s);
		sc1.close();
		
		Scanner sc2 = new Scanner(System.in);
		System.out.println("输入任意字符串:");
		s = sc2.nextLine();
		System.out.println(s);
		sc2.close();
		
		
	}
} 
 
运行结果: 
输入任意字符串: 
aaa 
aaaException in thread "main"  
输入任意字符串: 
java.util.NoSuchElementException: No line found 
        at java.util.Scanner.nextLine(Scanner.java:1540) 
        at lx.question.ScannerQuestion1.main(ScannerQuestion1.java:19) 
 
这个异常有点难以明白,没找到line,没输入肯定找不到,为什么sc2不等输入就直接去找了呢?于是我们把sc1.close();注释掉。 
 
运行结果: 
输入任意字符串: 
aaa 
aaa 
输入任意字符串: 
bbb 
bbb 
 
这里sc2的nextLine()方法会等待你录入line后再读取,好像更迷糊了,我们换一种键盘录入流的创建方式试试。 
 
[Java] 纯文本查看 复制代码 import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class ScannerQuestion1 {
	public static void main(String[] args) throws Exception {
		Scanner sc1 = new Scanner(System.in);
		System.out.println("输入任意字符串:");
		String s = sc1.nextLine();
		System.out.println(s);
		sc1.close();
		
		/*Scanner sc2 = new Scanner(System.in);
		System.out.println("输入任意字符串:");
		s = sc2.nextLine();
		sc2.close();*/
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		s = br.readLine();
		System.out.println(s);
		br.close();
	}
} 
 
运行结果: 
 
输入任意字符串: 
aaa 
aaaException in thread "main"  
java.io.IOException: Stream closed 
        at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170) 
        at java.io.BufferedInputStream.read(BufferedInputStream.java:336) 
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
        at java.io.InputStreamReader.read(InputStreamReader.java:184) 
        at java.io.BufferedReader.fill(BufferedReader.java:161) 
        at java.io.BufferedReader.readLine(BufferedReader.java:324) 
        at java.io.BufferedReader.readLine(BufferedReader.java:389) 
        at lx.question.ScannerQuestion1.main(ScannerQuestion1.java:22) 
 
这样就出现了很好辨识的异常信息,因为System.in被Scanner的close()关掉了。所以之后开启键盘输入流会出现异常。 
这也是为什么可能会多次用到键盘输入时不调用Scanner的close()的方法的原因。 |