异常
2021-04-23
java.util.NoSuchElementException:没有这个对象。
错误原因是在代码中错误提前关闭了System.in流。System.in流是一个final对象,一旦被close就无法再行初始化,从而导致异常。
对于Java提供的IO包中,一般都会处理资源级联关闭。即关闭最外层包装的流,内层被包被的流也会被关闭。
处理手段为:
- 在主线程结束的最后才关闭输入流
- (此方法转自优快云网友zhuangqingch)想解决关闭Scanner而不关闭System.in。只需要对传入Scanner构造方法的System.in做下包装就可以了。新包装的流要注意:1不产生新的流资源,2、是一个InputStream的实现类。3、close方法为空实现
可以实现jdk中提供的一个现成类FilterInputStream,它具备上述前2个特点。只需要使用内部匿名类的方式重写下close方法就可以了。具体代码如下:
import java.io.FilterInputStream;
import java.io.IOException;
import java.util.Scanner;
/**
* @author zhuangqing
*/
public class Test {
public static void main(String[] args) throws IOException {
testInput();
testInput();
}
public static void testInput() throws IOException {
//对于传入的System.in做包装
Scanner scan = new Scanner(new FilterInputStream(System.in){
@Override
public void close() throws IOException {
//do nothing
}
});
System.out.println("请输入一行字符:");
String str = scan.nextLine();
System.out.println("输入的字符:" + str);
scan.close();
}
}
```