1. 程式人生 > >Scanner類Java.util.NoSuchElementException 異常。

Scanner類Java.util.NoSuchElementException 異常。

今天使用Scanner類從控制檯獲得資料時,報了Java.util.NoSuchElementException 異常。

下面是問題程式碼段

public static void init(LinkList l){
        for(int i=0;i<3;i++){
            System.out.println("請輸入第"+i+"個值");
            Scanner temp=new Scanner(System.in);
            int len=temp.nextInt();
            l.addNode(len);
            temp.close();
        }
    }

當要輸入第二個資料的時候就會報錯 。
這是異常資訊

請輸入第0個值
2
請輸入第1個值
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at com
.zji.List.LinkList.init(LinkList.java:33) at com.zji.List.LinkList.main(LinkList.java:60)

這是因為temp.close()在for迴圈中關閉的原因,只要把temp.close(),寫在for迴圈外面就可以了。

剛開始我想我迴圈一次new 一個Scanner 然後給他關了 ,再迴圈再開不行嗎?
不可以的哦!
這是因為
你的Scanner.close會呼叫System.in.close方法,把這個System.in關閉了。你之後new Scanner並不會幫你開啟System.in的流,所以報錯了.

下面是close方法的原始碼可以參考一下

    public void close() {
        if (closed)
            return;
        if (source instanceof Closeable) {
            try {
                ((Closeable)source).close();
            } catch (IOException ioe) {
                lastException = ioe;
            }
        }
        sourceClosed = true;
        source = null;
        closed = true;
    }

感謝大佬們的幫助謝謝你們!