【问题标题】:Scanner.nextLine() is returning nothing when I try to use it twice当我尝试使用它两次时,Scanner.nextLine() 没有返回任何内容
【发布时间】:2020-09-09 18:28:05
【问题描述】:

我正在为我的班级决赛制作一个 8 球程序,并且我一直在使用我正在使用的 nextLine() 函数遇到错误。起初,在没有用户输入的情况下,它在回答任何问题之前就打印了答案,我以为我已经弄明白了,但是当我把它们放在同一个 for() 循环中时,它什么也没返回。我在这里做错了什么?这是我的代码。

import java.util.Random;
import java.util.Scanner;
import java.io.*;
class Main {
  public static void main(String[] args) throws IOException {
    Scanner reader = new Scanner(new File("8ball.txt"));
    Scanner reader2 = new Scanner(new File("medievalball.txt"));
    System.out.println("Welcome to 8 ball! You can choose a theme: Medieval or Normal, or type 'quit' to quit at any time.");
    Scanner input = new Scanner(System.in);
    String inInput = input.nextLine();
    String[] normal = new String[12];
    String[] medieval = new String[10];
    Random random = new Random();
    int randomNum = random.nextInt(10)+1;
    Random random2 = new Random();
    int randomNum2 = random2.nextInt(12)+1;
    while (true)
    {
    if (inInput.equals("Normal"))
    {
      System.out.println("You've selected Normal. Preparing... ");



      System.out.println("Ask me something, I can answer.");
      Scanner normalInput = new Scanner(System.in);

      for (int i=0; i < normal.length;i++)
      {
        normal[i] = normalInput.nextLine();
      }
    for (int i=0; i < normal.length;)
    {
      normal[i] = reader.nextLine();
     System.out.println(normal[randomNum]);
     break;
    }

    }

    else if (inInput.equals("Medieval"))
    {
      System.out.println ("You hath selected Medieval. Preparing...");
      System.out.println("I have unbearable knowledge of the world, ask me thine question.");
      Scanner medievalInput = new Scanner(System.in);
      for (int i=0; i < medieval.length;i++)
      {
        medieval[i] = medievalInput.nextLine();
      }
      for (int i=0; i < medieval.length;i++)
      {
        System.out.println(medieval[randomNum2]);
        break;
      }
    }
    else if (inInput.equals ("quit"))
    {
      System.out.println ("See you next time!");
      System.exit(0);
    }
    else
    {
      System.out.println("Sorry, that's not a choice.");
    }
  }
  }
}

【问题讨论】:

  • 我不太确定你想在循环中完成什么?您似乎用问题的答案填充数组?
  • 我试图让 8 球读取用户输入并在我按值提供的文本文件中用随机行响应。我不明白如何用问题的答案填充数组。

标签: java java.util.scanner next


【解决方案1】:

在尝试解决此问题之前,您需要充分了解基础知识。我已经强调了您程序中的一些问题:

  1. 如果normal.length &gt;= 1的值,下面的语句会创建一个无限循环。您需要在循环语句的最后部分输入表达式来更改值i(例如i++)。

    for (int i=0; i < normal.length;)
    
  2. 您不需要Random 的多个实例来生成多个随机数。下面给出了如何使用Random 的同一实例生成多个随机数的示例。

    Random random = new Random();
    int randomNum = random.nextInt(10) + 1;
    int randomNum2 = random.nextInt(12) + 1;
    
  3. 每当您使用扫描仪从文件中读取内容时,您应该始终使用Scanner::hasNextLine 来避免使用NoSuchElementException,例如以下代码块

    for (int i=0; i < normal.length; i++) {
        normal[i] = reader.nextLine();
        //...
    }
    

    应该写成

    for (int i=0; i < normal.length && reader.hasNextLine(); i++) {
        normal[i] = reader.nextLine();
        //...
    }
    
  4. 没有条件的break 在循环中是没有意义的,例如以下块中的break 语句将导致循环在第一次迭代后终止,驳斥了使用循环的目的。

    for (int i=0; i < medieval.length;i++) {
        System.out.println(medieval[randomNum2]);
        break;
    }
    

【讨论】:

  • 谢谢你,这对我帮助很大!我只是偶然发现了一件事,当我不使用 break 时,同一行会被正常读取 12 次,中世纪会被读取 10 次。我无法完全弄清楚如何解决这个问题。
  • 不客气。多次打印的原因可能是由于我或其他任何人只能在查看文件内容后才能评论的其他封闭循环。我建议您发布一个新问题,其中包含您在这些 cmets 之后所做的所有更改。不要编辑这个问题;否则,这个答案将变得无关紧要。当您发布新问题时,请确保使用相关标题并在问题中包含文件的内容,8ball.txtmedievalball.txt
  • 另外,不要忘记接受这个答案,以便未来的访问者也可以放心使用它。检查meta.stackexchange.com/questions/5234/… 了解如何操作。如有任何疑问/问题,请随时发表评论。
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
  • 2023-01-25
  • 2020-05-15
  • 1970-01-01
相关资源
最近更新 更多