请教个Scanner的问题

Marburger 2012-12-13 05:55:54
今天上机课做题的时候出现的问题,是关于scanner.nextInt()的,代码运行的时候没有等我输入第二个数就报NoSuchElementException异常了,后来发现把19行的代码注释掉就能正常运行了,但不知道原因是什么,自己想了想,难道是跟System.in有关?两个scanner共享一个System.in,关了一个scanner,另一个就无法正常运行?初学Java,请指教。


import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Demo1 d1 = new Demo1();
System.out.println("请输入两个数");
int i1 = d1.select();
Demo2 d2 = new Demo2();
int i2 = d2.select();
System.out.println(i1+i2);
}
}
class Demo1
{
public int select()
{
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
scan.nextLine();
scan.close();//这句注释掉就能正常运行
return i;
}
}
class Demo2
{
public int select()
{
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
scan.nextLine();
scan.close();
return i;
}
}

异常信息:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Demo2.select(ScannerDemo.java:33)
at ScannerDemo.main(ScannerDemo.java:10)
...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqid88147418 2012-12-14
  • 打赏
  • 举报
回复
当你第一次输入一个值的时候,你已经将输入流关掉了,所以再输入的时候就找到不输入流了 ,你可以将你所谓的19行代码移到程序的末尾,或则会循环外面,就不会出现这样的问题了。
Devin_1988 2012-12-14
  • 打赏
  • 举报
回复
引用 6 楼 ldh911 的回复:
引用 5 楼 Devin_1988 的回复:我也刚好遇到这样的问题,但我想问下,我们执行了System.in.close()后再创建新的Scanner sc = new Scanner(System.in)不会重新开起这个流吗? NO
不论你new 多少个BufferedReader这些都是外层的缓冲流。也叫高级流。但是实际上底层用的还是System.in。 这个流被关闭了。你new 多少个BufferedReader有什么用。我上面就说了这个System.in是System类被加载的时候就分配好的final变量。所以你System.in已经被关闭了。你外层的流在怎么new也是无用,因为底层的流被关闭了。 继续追问,3楼别烦我哈。我能把System.in看成还在InputStream更里面的一层流,连接计算机输入设备的一种类流。(BufferedReader是处理流,InputStream是节点流,然后System.in是更进的一层流) 这是我在另一个贴子提的和人家回答的情况,你能帮我也解答下吗?
MiceRice 2012-12-14
  • 打赏
  • 举报
回复
引用 5 楼 Devin_1988 的回复:
我也刚好遇到这样的问题,但我想问下,我们执行了System.in.close()后再创建新的Scanner sc = new Scanner(System.in)不会重新开起这个流吗?
NO
Devin_1988 2012-12-14
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
Java中,对流的操作都是级联的,你的第 19 行相当于执行了 System.in.close(); 所以你懂的。。。
我也刚好遇到这样的问题,但我想问下,我们执行了System.in.close()后再创建新的Scanner sc = new Scanner(System.in)不会重新开起这个流吗?
Marburger 2012-12-14
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
Java中,对流的操作都是级联的,你的第 19 行相当于执行了 System.in.close(); 所以你懂的。。。
懂了 把19行注释掉的话,在eclipse里 总是警告我没有把scan关闭 也挺烦的
zhaoming262350 2012-12-13
  • 打赏
  • 举报
回复
close() public void close()关闭此扫描器。 如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。如果此扫描器已经关闭,则调用此方法无效。 在扫描器关闭后执行搜索操作将导致 IllegalStateException。
MiceRice 2012-12-13
  • 打赏
  • 举报
回复
Java中,对流的操作都是级联的,你的第 19 行相当于执行了 System.in.close(); 所以你懂的。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧