我如何使Java在将输入分配给变量之前先等待输入,以避免java.util.NoSuchElementException

时间:2018-11-16 08:07:39

标签: java class object java.util.scanner

我正在研究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 :(得分:1)

请勿关闭您的Scanner,它也会关闭System.in

  

关闭扫描器后,如果扫描器实现了Closeable接口,它将关闭其输入源

据我了解(如果我错了,请纠正我)关闭objNumInput的原因是您想以两种不同的方法使用它。

我建议您将Scanner作为输入参数传递到方法inputNameinputLength中。然后,您将能够重复使用同一台扫描仪而无需在两者之间关闭它。

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);
}

答案 1 :(得分:0)

放入objNumInput.close();在您的main方法中执行for循环之后。之所以闪烁程序而无需第二次暂停是因为在执行objNumInput.close()时System.in已关闭;在主要方法的第3行

  • 关闭Scanner对象将关闭基础流。 -您的代码只能工作一次,因为System.in正在关闭。您不能再次“打开” System.in。关闭的流无法重新打开