2015-04-12 2 views
3

Я прорисовал этот код и не могу понять, как его исправить. При запуске кода почему бы пользователю не запрашивать ввод, а не Java, определяющий, что ввода нет? След ошибок ниже.Почему этот код получает исключение Java NoSuchElement?

import java.util.*; 
public class SortAsInserted { 

    public static void main(String[] args) { 
     int array_size = GetArraySize(); 
     //System.out.println(array_size); 
     String[] myArray = new String[array_size]; 
     for (int i = 0; i < array_size; i++){ 
      String next_string = GetNextString(); 
      System.out.println(next_string); 
     } 
    } 



    //public static String[] SortInsert(String nextString){ 
     //} 

    public static int GetArraySize(){ 
     Scanner input = new Scanner(System.in); 
     System.out.print("How many items are you entering?: "); 
     int items_in_array = input.nextInt(); 
     input.close(); 
     return items_in_array; 


    } 

    public static void PrintArray(String[] x) { 
     for (int i = 0; i < x.length; i++){ 
      System.out.print(x[i]); 
     } 

    } 

    public static String GetNextString(){ 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter the next string: "); 
     String next_string = input.nextLine(); 
     input.close(); 
     return next_string; 

     } 

Здесь ошибка -

How many items are you entering?: 2 
Enter the next string: 
Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at SortAsInserted.GetNextString(SortAsInserted.java:40) 
    at SortAsInserted.main(SortAsInserted.java:10) 
+0

Пожалуйста, придерживайтесь Java именования , методы должны быть в 'camelCase'. –

+0

Не закрывайте сканер, если хотите продолжить чтение из того же потока. – laune

+0

См. Также http://stackoverflow.com/questions/14962082/close-scanner-without-closing-system-in – Bobulous

ответ

5

Простой ответ, когда вы закрываете Scanner - основной входной поток также закрывается: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close()

Чтобы исправить это создать сканер один раз в основной:

public class SortAsInserted { 
    static Scanner input; 
    public static void main(String[] _) { 
     input = new Scanner(System.in); 
     .... 
     input.close(); 
    } 
3

Удалить input.close(); из кода

+0

Это не поможет чрезмерно, поскольку OP каждый раз воссоздает «Сканер», и ему нужно быть повторно использован. –

+1

Замечание 'input.close()' исправляет проблему. Но передовая практика предполагает, что экземпляр «Сканер» должен быть закрыт. – Bobulous

+0

Да Создайте сканер в основном методе и закройте его. –

0

Удаление метода scanner.close() из двух функций позволит решить вашу проблему.

import java.util.*; 
public class SortAsInserted { 

    public static void main(String[] args) { 
     int array_size = GetArraySize(); 
     //System.out.println(array_size); 
     String[] myArray = new String[array_size]; 
     for (int i = 0; i < array_size; i++){ 
      String next_string = GetNextString(); 
      System.out.println(next_string); 
     } 
    } 



    //public static String[] SortInsert(String nextString){ 
     //} 

    public static int GetArraySize(){ 
     Scanner input = new Scanner(System.in); 
     System.out.print("How many items are you entering?: "); 
     int items_in_array = input.nextInt(); 
     //input.close(); 
     return items_in_array; 


    } 

    public static void PrintArray(String[] x) { 
     for (int i = 0; i < x.length; i++){ 
      System.out.print(x[i]); 
     } 

    } 

    public static String GetNextString(){ 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter the next string: "); 
     String next_string = input.nextLine(); 
     // input.close(); 
     return next_string; 

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