提问者:小点点

方法中的扫描程序对象和NoSuchElementException[重复]


我真的试图通过线程找到答案,但仍然希望得到一些反馈。

我认为下面的代码是错误的风格,但是我不知道为什么它在输入数字后给我一个< code > Java . util . nosuchelementexception ,因为我为两个方法创建了两个Scanner对象,我应该可以开始一个新的输入。如果我删除inputAndPrintNumber()中的< code>input.close(),它就可以正常工作和编译。我真的希望知道为什么以及如何修复它,如果我仍然使用两个扫描仪obj并且如果可能的话不擦除< code>input.close()。

import java.util.*;
public class t{

public static void main(String [] args){
    inputAndPrintNumber();
    inputAndPrintString();
}

public static void inputAndPrintNumber(){
    Scanner input = new Scanner(System.in);
    String s = input.nextLine();        
    System.out.print(s);        
    input.close();
}

public static void inputAndPrintString(){
    Scanner input2 = new Scanner(System.in);
    int a = input2.nextInt();       
    System.out.print(a);
}
}

我甚至不确定下面的代码是更好还是更好的主意?

import java.util.*;

public class t{
public static Scanner input = new Scanner(System.in);
public static void main(String [] args){
    inputAndPrintNumber();
    inputAndPrintString();  
    input.close();
}

public static void inputAndPrintNumber(){
    String s = input.nextLine();        
    System.out.print(s);
}

public static void inputAndPrintString(){
    int a = input.nextInt();        
    System.out.print(a);
}
}

共1个答案

匿名用户

当你调用 scanner.close() 时,它不仅会关闭扫描器,还会关闭它从中读取数据的流,在本例中 System.in。因此,如果您要稍后使用 System.in 请不要关闭它(如果它已关闭,我们将无法重新打开它并从中读取任何数据,因此例外)。

第二个代码示例解决了这个问题,因为当您确定不会从输入流中读取任何其他内容时,扫描仪正在关闭。

顺便说一下,您似乎混淆了应该调用< code>nextLine和< code>nextInt的位置(< code>nextLine似乎更适合于< code>inputAndPrintString,而< code>nextInt则更适合于< code>inputAndPrintNumber)。