Я буду краток и прост, вот программа -
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
Понятия не имею, что происходит. Это ошибка? Пожалуйста помоги




Вы используете сканер для ввода пользовательских данных.
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 ссылка на сайт, у него есть хорошее объяснение.
Отчасти проблема в том, что вы создаете несколько сканеров. Создайте один сканер и используйте его везде, например:
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
Почему невозможно повторно открыть закрытый (стандартный) поток?
В чем заключалась реальная проблема при использовании нескольких сканеров?
У меня нет для вас отличного ответа, извините. Похоже, новый сканер либо очищает входной поток, либо игнорирует данные, уже находящиеся во входном потоке.
Я не использовал метод nextLine (). Кстати, попытается использовать метод bufferedreader