2013-03-15 137 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

你有一個以上的Scanner先關閉,其中關閉底層InputStream,因此另一個Scanner不能再從同一InputStreamNoSuchElementException讀取結果。

對於控制檯應用程序,請使用單個Scanner來讀取System.in

+0

感謝您的幫助,eclipse給了我一個關於不關閉掃描儀的警告,我不會另外添加。 – user2175782 2013-03-15 23:19:59

2

既然你打印出所有三個地方的異常被捕獲了同樣的信息,很難肯定地說,這是怎麼回事:

  • 使用printStackTrace()找出異常是發生

  • 不要捕捉Exception這樣。捕獲您期望的異常,並確保您的代碼能夠處理。如果你趕上Exception你可能最終會捕獲各種各樣的意外的例外(NPE,文件結尾等)......並且不正確報告它們爲「無效格式」。

+1

+1。另外,在'getValidDouble(String prompt,double min,double max)'你有'int i = 0;',你確定你想讓我成爲'int'嗎? – Adeeb 2013-03-15 23:10:11

+0

沒有看到,謝謝Adeeb。 – user2175782 2013-03-15 23:20:40

+0

請解釋downvote。請注意,該問題的原始版本沒有說明例外情況。 – 2013-03-16 01:26:09