2013-06-05 3 views
0

я получаю эту ошибку, и я не знаю, почему:Confusin Ошибка с помощью сканера

Exception in thread "main" java.util.NoSuchElementException 
at java.util.Scanner.throwFor(Scanner.java:907) 
at java.util.Scanner.next(Scanner.java:1530) 
at java.util.Scanner.nextInt(Scanner.java:2160) 
at java.util.Scanner.nextInt(Scanner.java:2119) 
at Daily.takingData(Daily.java:33) 
at Daily.main(Daily.java:20) 

это мой код:

import java.io.*; 
import java.util.Scanner; 

public class Daily  
{ 

    private static int size; 

    public static void main(String[] args) throws Exception { 
     System.out.println("Please enter amount of rows"); 
     Scanner scan1 = new Scanner(System.in); 
     size = scan1.nextInt(); 
     scan1.close(); 

     System.out.println(); 
     takingData(size); 
    } 

    public static void takingData(int rows) throws Exception { 
     System.out.println("Enter 1 To View Number of Markets"); 
     System.out.println("Enter 2 To View Start and End Dates of Markets"); 
     System.out.println("Enter 3 To View Start and End Dates of Contracts"); 
     System.out.println("Enter 4 To View Averages of Markets"); 
     System.out.println("Enter 0 To Quit Program"); 
     int choice = 0; 
     Scanner scan2 = new Scanner(System.in); 
     choice = scan2.nextInt(); 
     System.out.println("Got here"); 
     scan2.close(); 
     if (choice == 0) 
      System.exit(0); 
    } 
} 

Моя Из пут:

Enter 1 To View Number of Markets 
Enter 2 To View Start and End Dates of Markets 
Enter 3 To View Start and End Dates of Contracts 
Enter 4 To View Averages of Markets 
Enter 0 To Quit Program 
(error here) 
+0

он работает для меня без ошибок – sanbhat

+0

Я импортировал сканер – user2455869

+0

У меня есть закрывающие скобки – user2455869

ответ

1

Проблема в том, что вы закрываете первый экземпляр Scanner здесь

scan1.close(); 

, который закрывает связанный с ним InputStream (System.in) - это предотвращает второй экземпляр Scanner чтения из потока.

Не закрывайте сканер. Также вы можете создать один экземпляр сканера для чтения всех значений.

С точки зрения дизайна, я бы перейти от static методов к OO подхода с одной Scanner экземпляр, созданный в конструкторе Daily и все методы становятся методы экземпляра. Это поможет с тестируемостью Object.

public class Daily { 

    private final Scanner scanner; 

    public Daily() { 
     scanner = new Scanner(System.in); 
    } 

    public int getRows() { 

     System.out.println("Please enter amount of rows"); 
     return scanner.nextInt(); 
    } 

    public static void main(String[] args) throws Exception { 

     Daily daily = new Daily(); 
     int rows = daily.getRows(); 

     int mainOption = daily.getMainOption(rows); 
     switch (mainOption) { 
     case 0: // TODO: refactor to use enums 
      System.exit(0); 
     } 
    } 

    public int getMainOption(int rows) { 
     System.out.println("Enter 1 To View Number of Markets"); 
     System.out.println("Enter 2 To View Start and End Dates of Markets"); 
     System.out.println("Enter 3 To View Start and End Dates of Contracts"); 
     System.out.println("Enter 4 To View Averages of Markets"); 
     System.out.println("Enter 0 To Quit Program"); 

     return scanner.nextInt(); 
    } 
} 
-1

Избавьтесь от первоначального выбора INT, и попробуйте следующее:

int choice = scan2.nextInt(); 

не должны реально изменить ситуацию, но это может помочь.

1

Вы получаете сообщение об ошибке, потому что вы закрываете сканер сразу после сканирования:

size = scan1.nextInt(); 
scan1.close(); 

, а затем повторите сканирование в takingData

scan1.close(); удалить, что находится за пределами вашего takingData.

Когда вы закрываете Scanner, InputStream, что он сканируется, также закрыт, в этом случае ваш System.in закрывается.

Когда сканер закрыт, он закроет свой входной источник, если источник реализует интерфейс Closeable.

Взятые из Scanner javadocs

0

Ответ на ваш вопрос здесь: https://stackoverflow.com/a/13042296/1688441 на вопрос: java.util.NoSuchElementException - Scanner reading user input

Я цитирую:

Когда вы звоните, sc.close() в первом методе, он не только закрывает ваш сканер , но и закрывает входную строку System.in EAM также.Это вы можете проверить, напечатав свой статус на самом верху второго метода, как:

System.out.println(System.in.available()); 

Так что теперь, когда вы повторно создать экземпляр, сканер во втором методе, он не находит открытый System.in потока и, следовательно, исключение.

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