2013-03-15 8 views
7

Javaの割り当てに問題があります。スキャナNoSuchElementException

java.util.NoSuchElementExceptionを:私は具体的には、予期しない例外を取得していませラインは、私はScanner(System.in)を使用しています

を発見していないとプログラムは継続的に何を読んでいないと、「無効な形式」の例外を繰り返していますテキスト。正しく評価されたintを入力すると、最初の部分が過ぎてからdoubleの部分がすぐにこの例外に入ります。間違った値のintを入力すると、例外がループし始めます。ここで

私のコードです:

import java.util.Scanner; 

public class Program_4 { 

    public static void main(String[] args) { 
     getValidInt("Enter an integer from 5 to 50",5,50); 
     getValidDouble("Enter a double from 5.0 to 50.0",5.0,50.0); 
     getValidString("Enter a string with length from 5 to 8 characters",5,8); 
    } 


    public static int getInt(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     int i = 0; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = Integer.parseInt(sc.nextLine()); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
       System.out.print("Invalid Format: "); 
       isValid = false; 
      } 
     } 
     while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static int getValidInt(String prompt, int min, int max) 
    { 
     int i = 0; 
     boolean isValid = false; 
     do 
     { 
      i = getInt(prompt); 
      if(i < min) System.out.println("Value must be >= " + min); 
      else if(i > max) System.out.println("Value must be <= " + max); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 

    public static double getDouble(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     double i = 0.0; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = Double.parseDouble(sc.nextLine()); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
       System.out.println("Invalid Format: "); 
       isValid = false; 
      } 
     } while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static double getValidDouble(String prompt, double min, double max) 
    { 
     int i = 0; 
     boolean isValid = false; 
     do 
     { 
      i = getInt(prompt); 
      if(i < min) System.out.println("Value must be >= " + min); 
      else if(i > max) System.out.println("Value must be <= " + max); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 

    public static String getString(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     String i=""; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = sc.nextLine(); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.print("Invalid Format: "); 
       isValid = false; 
      } 
     } while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static String getValidString(String prompt, int min, int max) 
    { 
     String i; 
     boolean isValid = false; 

     do 
     { 
      i = getString(prompt); 
      if(i.length() < min) System.out.println("String must be more than "  + min + " characters."); 
      else if(i.length() > max) System.out.println("String must be more  than " + max + " characters."); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 
} 

答えて

14

あなたは基礎となるInputStreamを閉じて、あなたが閉じ複数Scannerは、したがって、別のScannerがもはや同じInputStreamNoSuchElementException結果から読み取ることができていません。

コンソールアプリの場合はScannerを使用してSystem.inから読み取ります。

+0

助けてくれてありがとう、日食は私にスキャナを閉めないという警告を与えていました。 – user2175782

2

あなたは例外がキャッチされた3つのすべての場所で同じメッセージをプリントアウトしているので、何が起こっているすべての確信を持って言うことは困難である:

  • 使用printStackTrace()例外が

  • が起こっているところそのようなExceptionをキャッチしないでください見つけるために。期待している例外と、コードが処理できるように設計されている例外をキャッチします。 Exceptionをキャッチすると、予期しない例外(NPE、ファイルの終わりなど)...との間違った種類のキャッチが発生する可能性があります。は「無効な形式」と報告しています。

+1

+1。また、 'getValidDouble(String prompt、double min、double max)'には 'int i = 0;'があります。 – Adeeb

+0

それを見ていない、ありがとうAdeeb。 – user2175782

+0

downvoteを説明してください。問題の元のバージョンは、例外が何であったかは分かりませんでした。 –

関連する問題