今天上机课做题的时候出现的问题,是关于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)

解决方案 »

  1.   

    Java中,对流的操作都是级联的,你的第 19 行相当于执行了 System.in.close();所以你懂的
      

  2.   

    close()
    public void close()关闭此扫描器。 
    如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。如果此扫描器已经关闭,则调用此方法无效。 在扫描器关闭后执行搜索操作将导致 IllegalStateException。 
      

  3.   


    懂了把19行注释掉的话,在eclipse里 总是警告我没有把scan关闭 也挺烦的
      

  4.   


    我也刚好遇到这样的问题,但我想问下,我们执行了System.in.close()后再创建新的Scanner sc = new Scanner(System.in)不会重新开起这个流吗?
      

  5.   


    不论你new 多少个BufferedReader这些都是外层的缓冲流。也叫高级流。但是实际上底层用的还是System.in。
    这个流被关闭了。你new 多少个BufferedReader有什么用。我上面就说了这个System.in是System类被加载的时候就分配好的final变量。所以你System.in已经被关闭了。你外层的流在怎么new也是无用,因为底层的流被关闭了。 继续追问,3楼别烦我哈。我能把System.in看成还在InputStream更里面的一层流,连接计算机输入设备的一种类流。(BufferedReader是处理流,InputStream是节点流,然后System.in是更进的一层流) 这是我在另一个贴子提的和人家回答的情况,你能帮我也解答下吗?