Java 如何在main和method中使用扫描仪
我试图在main和其他方法中获得输入,但我不清楚如何使扫描仪在这两种方法中都工作 这给了我一个奇怪的错误:Java 如何在main和method中使用扫描仪,java,Java,我试图在main和其他方法中获得输入,但我不清楚如何使扫描仪在这两种方法中都工作 这给了我一个奇怪的错误: Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at java.util.Scanner.nextDouble(Unknown Sourc
Exception in thread "main"
java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)
at Hwk11.getRainData(Hwk11.java: 28)
at Hwk11.main(Hwk11.java: 18)
代码:
import java.util.Scanner;
公共级Hwk11{
公共静态void main(字符串[]args){
扫描仪标准输入=新扫描仪(System.in);
System.out.println(“您有多少周的数据?”);
int numWeeks=stdin.nextInt();
如果(numWeeks 52){
System.out.println(“无效周数”);
}
否则{
双倍[]雨周=新双倍[数周];
获取降雨数据(降雨周);
showRain(降雨周);
}
}
公共静态无效getRainData(双[]降雨){
扫描仪标准输入=新扫描仪(System.in);
System.out.println(“输入每周降雨量”);
对于(int index=0;index
对我有用。如果您要求下一次翻倍,请不要输入任何内容,只有一个翻倍,因此没有“2.3厘米”,只需通过2.3并在打印时添加厘米即可
我假设您的showRain(double[]rain)
方法可能在getRaindata(double[]rain)
能够完成并填充数组之前执行。传递到showRain(double[]rain)
的数组可能为空
尝试在getRanData(double[]rain)
交替尝试将整个扫描仪对象传递给方法
public static void getRainData(double[] rainFall, Scanner stdin) {
//Scanner stdin = new Scanner(System.in);
System.out.println("Enter the weekly rainfall for each week.");
for (int index = 0; index < rainFall.length; index++) {
System.out.println("Week number " + (index + 1) + ":");
rainFall[index] = stdin.nextDouble();
}
showRain(rainFall);
}
公共静态无效getRainData(双[]降雨,扫描仪标准){
//扫描仪标准输入=新扫描仪(System.in);
System.out.println(“输入每周降雨量”);
对于(int index=0;index
使用完扫描仪后,别忘了关闭它 人们说“为我工作”
行为(是否有效)取决于输入的确切方式
- 如果您以交互方式提供输入,它可能会起作用
- 如果您通过如下重定向标准输入来提供输入:
java Hwk11 < input.txt
那就不会了java Hwk11
扫描仪
将提前读取并缓冲其输入流中的任何可用字符。正常情况下,这很好,但在代码中,您创建了两个不同的扫描器
对象以从系统中读取。因此,当标准输入被重定向时:
- 第一个
Scanner.nextInt
调用将导致大部分/所有输入缓冲在第一个Scanner
- 当创建第二个
扫描仪
并调用Scanner.nextDouble
时,它将看不到第一个扫描仪
中缓冲的输入,这将导致异常。。。当输入字符“太快”用完时
解决方案是不要为同一输入流创建多个扫描仪
对象。使用一个Scanner
并将其放入一个字段中,或将其作为参数传递到需要使用的所有位置。对我来说效果很好。您可以显示您提供的输入吗?NoTouchElementException
通常意味着扫描仪的流中有符合查找要求的元素-在您的情况下,无double
值。另外,不要创建新的扫描仪
,只需从main
方法中传递扫描仪
。@MadProgrammer如何传递扫描仪?@David您可以在方法之外创建一个静态扫描仪(就在公共类Hwk11下面)静态扫描仪stdin=new Scanner(System.in);并移除其他偏差。showRain无法在getRainData之前执行,同时,将非双精度输入也会导致InputMismatchException(不是NoTouchElement),我只是假设这是因为可能发生随机错误。在最初的回答中忘了说那个
java Hwk11 < input.txt