方法中的扫描器对象和NoSuchElementException
我真的试图通过线程找到答案,但仍然希望得到一些反馈。
我认为下面的代码是糟糕的风格,但我不知道为什么它在输入数字之后向我发送java.util.NoSuchElementException
,因为我为两个方法制作了两个Scanner对象,我应该能够开始一个新的输入。 如果我擦除input.close()
中的input.close(),它可以正常工作和编译。 我真的希望知道为什么以及如何解决它,如果我仍然使用两个Scanner obj并且如果可能的话不擦除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); } }
当你调用scanner.close()
它不仅关闭扫描程序,还关闭它从中读取数据的流,在本例中是System.in
。 因此,如果您要使用System.in
请不要关闭它(如果它已关闭,我们无法重新打开它并从中读取任何数据,因此exception)。
您的第二个代码示例解决了这个问题,因为当您确定不会从输入流中读取任何其他内容时,Scanner将被关闭。
顺便说一句,你似乎混合了应该调用nextLine
和nextInt
地方( nextLine
似乎更适合inputAndPrintString
而nextInt
适用于inputAndPrintNumber
)。