java.util.NoSuchElementException没有这样的元素异常

Rav*_*vin 5 java

Java新手 - 只是试图掌握它.该程序执行如下:

What's your age?23
23
What's your name?Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at king.getName(king.java:25)
    at king.main(king.java:9)
Run Code Online (Sandbox Code Playgroud)

它试图运行的代码如下:

import java.util.*;

public class king {



    public static void main(String[] args){
        System.out.println(getAge());
        System.out.println(getName());
    }

    public static int getAge(){
        System.out.print("What's your age?");
        Scanner scanner = new Scanner(System.in);
        String age = scanner.next();
        scanner.close();
        int numberAge = Integer.parseInt(age);
        return numberAge;

    }

    public static String getName(){
        System.out.print("What's your name?");
        Scanner newScanner = new Scanner(System.in);
        String name = newScanner.next();
        newScanner.close();
        return name;
    }

}
Run Code Online (Sandbox Code Playgroud)

Ani*_*nge 9

不要使用scanner.close()< - 您的错误来源!

删除行scanner.close()和newScanner.close()

来自Java DOC:

当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源.

这意味着它关闭了System.in- 糟糕的选择!

从Scanner.javaJDK的源代码,throwFor()是:

private void throwFor() {
    skipped = false;
    if ((sourceClosed) && (position == buf.limit()))
        throw new NoSuchElementException();
    else
        throw new InputMismatchException();
}
Run Code Online (Sandbox Code Playgroud)

显然,如果我们已经到达输入的末尾,或者如果源被关闭,那么我们得到了NoSuchElementException().我很确定IDEONE的那个发生了因为position == buf.limit()而不是sourceClosed