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)

実行しようとしているコードは次のとおりです。

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 DOCから:

スキャナーを閉じると、ソースが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

alraedy@Aniketは非常に良い答えを出したと思います。

  • まず第一に、import java.util.*;あなたの代わりに使用できるimport java.util.Scanner;ので、不要なクラスをインポートしません。
  • 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;
        }
    }
    
于 2013-02-27T10:52:24.093 に答える
1

まず、NoSuchElementException を回避するには、Scanner.next() を使用する前に Scanner.hasNext() チェックを実行する必要があります。特に単一のスキャナーの使用に関するその他のコメントも役立ちます。

于 2013-02-27T11:30:15.793 に答える