2013-02-27 57 views
5

Java新手 - 试图获取它的句柄。该程序执行如下:java.util.NoSuchElementException不存在这样的元素异常

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

} 

回答

9

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

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

从Java文档:

When a Scanner is closed, it will close its input source if the source implements the Closeable interface.

这意味着它关闭System.in - 不错的选择!

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

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

显然,如果我们已经达到了输入的末尾,或者如果源被关闭,那么我们得到的NoSuchElementException()。我敢肯定那个在IDEONE已经因为position == buf.limit()而非sourceClosed

+0

这似乎是工作,但现在日食是关于资源泄漏的怀疑? – Ravin 2013-02-27 10:42:14

+0

+1的解释 – 2013-02-27 10:42:23

+0

@Ravin我没有看到你的代码中的“资源”泄漏有什么问题。 – 2013-02-27 10:50:29

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类应该大写。

1

我觉得alraedy @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; 
        } 
    } 
    
+0

它给出了同样的错误:http://ideone.com/cmPucv – CloudyMarble 2013-02-27 10:56:54

+0

@MeNoMore它在我的机器上工作,我使用eclipse juno,jdk7.0 – Bhushan 2013-02-27 11:07:48

1

首先,避免NoSuchElementException异常应执行扫描仪.hasNext()在使用Scanner.next()之前检查。其他有关使用单个扫描仪的意见也很有用。

+0

为'hasNext()'+1 - 它避免了'pos == buf.limit()' – 2013-02-27 11:33:47

相关问题