2013-03-15 4 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 больше не может читать из той же InputStream и через NoSuchElementException результатов.

Для консольных приложений используйте Scanner для чтения с System.in.

+0

Спасибо за помощь, затмение дало мне предупреждение о закрытии сканера, и я бы не добавил, что в противном случае. – user2175782

2

С распечатанной же сообщение во всех трех местах, где пойманных исключением, что трудно с уверенностью сказать, что происходит:

  • Используйте printStackTrace(), чтобы выяснить, где исключение происходит

  • не поймать Exception подобное. Поймите исключения, которые вы ожидаете, и что ваш код предназначен для обработки. Если вы поймаете Exception, вы можете в конечном итоге поймать всевозможные неожиданные исключения (NPE, конец файла и т. Д.) ... и неверно сообщают о них как «Недопустимый формат».

+1

+1. Кроме того, в 'getValidDouble (приглашение строки, double min, double max)' у вас есть 'int i = 0;', вы уверены, что хотите, чтобы я был 'int'? – Adeeb

+0

Не видел этого, спасибо Adeeb. – user2175782

+0

Просьба пояснить нижний план. Обратите внимание, что в исходной версии вопроса не указано, что такое исключение. –

Смежные вопросы