Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在main和method中使用扫描仪_Java - Fatal编程技术网

Java 如何在main和method中使用扫描仪

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

我试图在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 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