如何在main和method中使用Scanner

时间:2018-05-07 03:23:24

标签: java

我试图在主要方法和其他方法中获得输入,但我不清楚如何使扫描仪在两者中都能正常工作。

它给了我一个奇怪的错误:

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;
public class Hwk11 {
  public static void main(String[] args) {
    Scanner stdin = new Scanner(System.in);
    System.out.println("How many weeks of data do you have?");
    int numWeeks = stdin.nextInt();
    if (numWeeks <= 0 || numWeeks > 52) {
      System.out.println("Invalid number of weeks.");
    }
    else {
      double[] rainWeeks = new double [numWeeks];
      getRainData(rainWeeks);
      showRain(rainWeeks);
    }
  }

  public static void getRainData(double[] rainFall) {
    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();
    }
  }

  public static void showRain(double[] rainFall) {
    for (int index = 0; index < rainFall.length; index++) {
      System.out.print(rainFall[index] + " ");
    }
  }
}

2 个答案:

答案 0 :(得分:0)

人们说&#34;适合我&#34;。

行为(无论是否有效)的问题取决于输入的确切方式。

  • 如果您以交互方式提供输入,则可能会有效。
  • 如果您通过重定向标准输入来提供输入:

      java Hwk11 < input.txt
    

    然后它赢了

问题是Scanner将预读并缓冲其输入流中可用的任何字符。这通常很好,但是在您的代码中,您创建了两个不同的Scanner对象来从System.in读取。因此,当重定向标准输入时:

  • 第一个Scanner.nextInt调用将导致大部分/全部输入在第一个Scanner
  • 中缓冲
  • 当第二个Scanner被创建并且Scanner.nextDouble被调用时,它不会看到第一个Scanner中缓冲的输入,这将导致异常......当输入字符用完时#34;太快&#34;。

解决方案是不为同一输入流创建多个Scanner对象。使用一个Scanner并将其放在一个字段中,或将其作为参数传递给它需要使用的所有地方。

答案 1 :(得分:-1)

适合我。如果你要求下一个双倍所以不要输入任何东西,所以没有“2.3厘米”,只要通过2.3并在你打印时添加厘米

我假设你的showRain(double[] rainFall)方法可能在getRaindata(double[] rainFall)能够完成并填充数组之前执行。您传递给showRain(double[] rainFall)的数组可能为空。

尝试在showRain(double[] rainFall)

后循环播放getRanData(double[] rainFall)的方法调用

另外尝试将整个Scanner对象传递给方法。

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

完成扫描仪后,请不要忘记关闭它。