【问题标题】:Scanner Class inputs not ending with delimiter [duplicate]扫描器类输入不以分隔符结尾[重复]
【发布时间】:2017-06-19 13:00:28
【问题描述】:

我得到了所需的输出,但我的代码还没有完成运行。 我使用“/”作为扫描仪类的分隔符,我的代码是

Scanner scan = new Scanner(System.in);        
scan.useDelimiter("/");
while(scan.hasNext())
{
  System.out.println(scan.next());
}

我在“输出”窗口中给出的输入是

Input
abcdef/ghijkl/out/

Output:
abcdef
ghijkl
out

而且程序还在运行。

【问题讨论】:

  • 你确定要读多少个字符串(每个字符串用'/'分隔)?

标签: java java.util.scanner delimiter


【解决方案1】:
import java.util.Scanner; // headers MUST be above the first class

// one class needs to have a main() method
public class HelloWorld
{
 // arguments are passed using the text field below this editor
    public static void main(String[] args)
    {
    Scanner scan = new Scanner("abcdef/ghijkl/out/");        
    scan.useDelimiter("/");
    while(scan.hasNext())
        {
          System.out.println(scan.next());
        }
    }
}

这行得通。

您的问题可能是您正在打开键盘扫描仪 (System.in),但您没有将键盘输入的值存储在任何地方。您可能希望将输入设置为变量,就像我在教授 Java 的课程中​​一直所做的那样:

Scanner scan = new Scanner (System.in);
String input = scan.nextLine(); // input: "abcdef/ghijkl/out/"

String[] stringArray = input.split("/");
for(String i : stringArray)
{
    System.out.println(i);
}

【讨论】:

  • 我删除了我发布的最后一个代码 sn-p。这是不正确的。
【解决方案2】:

问题在于next() 方法。以下是Oracle Website 的摘录,其中指出此方法可能会在等待输入扫描时阻塞,即使之前调用 hasNext() 返回 true

公共字符串 next()

从这个扫描器中查找并返回下一个完整的令牌。一个完整的标记前后是匹配分隔符模式的输入。 此方法在等待输入扫描时可能会阻塞,即使之前调用 hasNext() 返回 true 也是如此

【讨论】:

    【解决方案3】:

    您必须使用scan.close(); 关闭扫描

    在这里你将使用它作为

    Scanner scan = new Scanner(System.in);        
    scan.useDelimiter("/");
    while(scan.hasNext())
    {
      System.out.println(scan.next());
      scan.close();
    }
    

    【讨论】:

    • 抛出一个IllegalStateException
    • 永远不要这样做,它会关闭System.in,这使得它在您的程序的剩余生命周期中不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多