2013-02-27 6 views
5

新規 - ちょうどそれにハンドルを取得しようとしています。次のようにプログラムが実行されている:java.util.NoSuchElementExceptionそのような要素例外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; 
    } 

} 

答えて

9

scanner.close() <を使用しないでください - あなたのエラーの原因を!

ラインに削除したJavaのドキュメントからscanner.close()newScanner.close()

それは System.in閉じ意味

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

- 悪い選択を!

JDKで Scanner.javaのソースコードから

throwFor()は次のとおりです。

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

明らかに、我々は入力の終わりに達した、またはソースが閉じている場合、我々はNoSuchElementException()を取得する場合。

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クラスが大文字にする必要があることに注意してください:私はIDEONE 1つが原因position == buf.limit()のではなく、sourceClosed

+0

これが動作しているようだが、今日食は、リソースリークについてwhingingされますか? – Ravin

+0

+1のための説明 –

+0

@Ravin私はあなたのコードで "リソース"リークが間違って表示されません。 –

1

はこれを試してみてください起こっているかなり確信しています。

1

私はalraedy @Aniketは非常に良い答えを与えていると思います。

  • 代わりにあなたはそれが不必要なクラスをインポートしませんimport java.util.Scanner;を使用することができますimport java.util.*;のまず第一に。
  • 2つ目は、私が例に示されているようにあなたは、単一の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

その同じエラーを与える: 'のhasNext()'のためのhttp://ideone.com/cmPucv – CloudyMarble

+0

@MeNoMoreそれは私のマシン上で動作しますが、私が使用しています日食JUNO、jdk7.0 – Bhushan

1

まず、はNoSuchElementExceptionを避けるために、あなたがスキャナを実行する必要があります.hasNext()はScanner.next()を使用する前にチェックします。特にシングルスキャナの使用に関する他のコメントも便利です。

+0

1 - それはのケースを回避します'pos == buf.limit()' –

関連する問題