5

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)

它试图运行的代码如下:

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;
    }

}
4

4 回答 4

9

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

删除线scanner.close()newScanner.close()

来自 Java 文档:

当 Scanner 关闭时,如果源实现了 Closeable 接口,它将关闭其输入源。

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

Scanner.javaJDK中的源代码来看,throwFor()是:

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

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

于 2013-02-27T10:38:41.297 回答
1

试试这个:

public class King {
  public static void main(final String[] args) {
    final Scanner scanner = new Scanner(System.in);
    System.out.println(getAge(scanner));
    System.out.println(getName(scanner));
  }

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

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

另请注意,java 类应大写。

于 2013-02-27T10:39:35.933 回答
1

我认为@Aniket 已经给出了一个很好的答案。

  • 首先,import java.util.*;您可以使用它代替它,import java.util.Scanner;这样它就不会导入不必要的类。
  • 第二件事是你可以有一个Scanner像我在例子中展示的那样。(所以你可以关闭它)

     import java.util.Scanner;
     public class SO6 {
         static Scanner scanner = new Scanner(System.in);
         public static void main(String[] args){
             System.out.println(getAge());
             System.out.println(getName());
             scanner.close();
         }
    
        public static int getAge(){
            System.out.print("What's your age?");
            String age = scanner.next();
            int numberAge = Integer.parseInt(age);
            return numberAge;
    
        }
    
        public static String getName(){
            System.out.print("What's your name?");
            String name = scanner.next();
            return name;
        }
    }
    
于 2013-02-27T10:52:24.093 回答
1

首先,为了避免 NoSuchElementException,您应该在使用 Scanner.next() 之前执行 Scanner.hasNext() 检查。其他评论,尤其是关于使用单个扫描仪的评论也很有用。

于 2013-02-27T11:30:15.793 回答