A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()的方法的原因。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马