Как заставить Java ждать ввода перед назначением ввода переменной, чтобы избежать java.util.NoSuchElementException - PullRequest
0 голосов
/ 16 ноября 2018

Я изучаю классы Java и пытаюсь создать код, в котором пользователь вводит, сколько объектов (в данном случае «куб») они хотят создать.

В моем основном классе у меня написан этот код

System.out.println("Enter the amount of objects you want to create");
Scanner objNumInput = new Scanner(System.in);
int objNum = objNumInput.nextInt();
objNumInput.close();
Cube cubes[] = new Cube[objNum];

for (int i = 0; i < objNum; i++){
  String cubeName = Cube.inputName();
  double cubeLength = Cube.inputLength();
  cubes[i] = new Cube(cubeName, cubeLength);
}

в моем классе Cube у меня здесь:

public static String inputName(){
  String cubeName;
  Scanner input = new Scanner(System.in);
  System.out.println("Enter the name: ");
  cubeName = input.nextLine();
  return cubeName;
}
public static double inputLength(){
  double cubeLength;
  Scanner input = new Scanner(System.in);
  System.out.println("Enter the length: ");
  cubeLength = input.nextDouble();
  return cubeLength;
}

Когда я запускаю его, я могу ввести количество «кубиков», которые я хочу создать. Затем он продолжает выдавать исключение

Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at Cube.inputName(Cube.java:40)
at Main.main(Main.java:88)

что не так?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Не закрывайте Scanner, он также закроет System.in.

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

Как я понимаю (поправьте меня, если я ошибаюсь),причина, по которой вы закрываете objNumInput, заключается в том, что вы хотите использовать его двумя разными способами.

Я бы предложил вам передать Scanner в качестве входного параметра в ваши методы inputName и inputLength.Тогда вы сможете повторно использовать тот же сканер, не закрывая его между ними.

public static String inputName(Scanner scanner){
    String cubeName;
    System.out.println("Enter the name: ");
    cubeName = scanner.nextLine();
    return cubeName;
}

public static double inputLength(Scanner scanner){
    double cubeLength;
    System.out.println("Enter the length: ");
    cubeLength = scanner.nextDouble();
    return cubeLength;
}    

...

System.out.println("Enter the amount of objects you want to create");
Scanner objNumInput = new Scanner(System.in);
int objNum = objNumInput.nextInt();
//objNumInput.close(); <-- Do not close the scanner
Cube cubes[] = new Cube[objNum];

for (int i = 0; i < objNum; i++){
    String cubeName = Cube.inputName(objNumInput);
    double cubeLength = Cube.inputLength(objNumInput);
    cubes[i] = new Cube(cubeName, cubeLength);
}
0 голосов
/ 16 ноября 2018

put objNumInput.close ();цикл for в вашем основном методе. Причина, по которой ваша программа мигает без остановки во второй раз, потому что System.in закрывается, когда вы выполняете objNumInput.close ();в строке № 3 основного метода

  • закрытие объекта Scanner закроет основной поток.Ваш код работает только один раз, потому что System.in закрывается.Вы не можете "открыть" System.in снова.Закрытый поток не может быть вновь открыт
...