Не удается получить ввод в простой программе вывода на Java

Я буду краток и прост, вот программа -

class Sample{
private int n;
public void getDetails(){
    Scanner y=new Scanner(System.in);
    n=y.nextInt();
    System.out.println("Entered 'n' = "+n);
}
public void displayDetails(){
    int i,j;
    int arr[]=new int[n];
    Scanner x=new Scanner(System.in);
    for(j=0;j<n;j++) {
        arr[j] = x.nextInt();
            System.out.println("Entered element = "+arr[j]);
    }
    System.out.println("Entered array: ");
    for(i=0;i<n;i++)
        System.out.print(arr[i]+" ");
    }
}

public class TestClass {
    public static void main(String[] args) {
        Sample obj = new Sample();
        obj.getDetails();
        obj.displayDetails();
        }
    }

Эта простая программа просто принимает количество элементов (n) и элементы массива (arr []) в качестве входных данных в различных методах. Когда ввод осуществляется в интерактивном режиме, все работает нормально. Вот вывод консоли:

5
Entered 'n' = 5
1 2 3 4 5
Entered element = 1
Entered element = 2
Entered element = 3
Entered element = 4
Entered element = 5
Entered array: 
1 2 3 4 5 

Но когда я даю его как ввод Stdin (или весь ввод сразу), он просто принимает количество элементов (n) и игнорирует мой ввод массива (arr []). Здесь мне пришлось снова передать элементы массива. Консольный вывод

5
1 2 3 4 5Entered 'n' = 5
1
Entered element = 1
2
Entered element = 2
3 4 5
Entered element = 3
Entered element = 4
Entered element = 5
Entered array: 
1 2 3 4 5 

Понятия не имею, что происходит. Это ошибка? Пожалуйста помоги

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы используете сканер для ввода пользовательских данных.

 Scanner y=new Scanner(System.in);

В классе Scanner, если мы вызываем метод nextLine () после любого из семи методов nextXXX (), тогда nextLine () не считывает значения с консоли, и курсор не попадет в консоль, он пропустит этот шаг. К методам nextXXX () относятся nextInt (), nextFloat (), nextByte (), nextShort (), nextDouble (), nextLong (), next ().

В классе BufferReader такой проблемы нет. Эта проблема возникает только для класса Scanner, поскольку методы nextXXX () игнорируют символ новой строки, а nextLine () читает только символ новой строки. Если мы используем еще один вызов метода nextLine () между nextXXX () и nextLine (), тогда эта проблема не возникнет, потому что nextLine () будет использовать символ новой строки.

Пожалуйста, проверьте это SO ссылка на сайт, у него есть хорошее объяснение.

Я не использовал метод nextLine (). Кстати, попытается использовать метод bufferedreader

S4rt-H4K 29.03.2018 19:08
Ответ принят как подходящий

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

import java.util.Scanner;

public class TestClass {
    public static void main(String[] args) {
        Sample obj = new Sample();
        obj.getArraySize();
        obj.displayDetails();
    }
}

class Sample{

    private int arraySize;
    Scanner scanner = new Scanner(System.in);

    public void getArraySize(){
        System.out.print("Enter size of array: ");
        arraySize = scanner.nextInt();
        System.out.println("Entered array size = " + arraySize);
    }

    public void displayDetails(){
        //Create an integer array of size arraySize
        int intArray[] = new int[arraySize];

        //Repeatedly request integers for the array
        for( int i=0; i<arraySize; i++) {
            int nextInt = scanner.nextInt();
            intArray[i] = nextInt;
            System.out.println("Entered element = " + intArray[i]);
        }

        //Print out the entered elements
        System.out.println("Entered array: ");
        for( int i=0; i<arraySize; i++) {
            System.out.print(intArray[i]+" ");
        }

        scanner.close();
    }
}

вывод консоли:

Enter size of array: 5
Entered array size = 5
5 4 3 2 1
Entered element = 5
Entered element = 4
Entered element = 3
Entered element = 2
Entered element = 1
Entered array: 
5 4 3 2 1 

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

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

Несколько сканеров Java

Почему невозможно повторно открыть закрытый (стандартный) поток?

В чем заключалась реальная проблема при использовании нескольких сканеров?

S4rt-H4K 29.03.2018 19:36

У меня нет для вас отличного ответа, извините. Похоже, новый сканер либо очищает входной поток, либо игнорирует данные, уже находящиеся во входном потоке.

Andrew LeMaitre 29.03.2018 19:47

Другие вопросы по теме