【问题标题】:Java: Read token by token of an input stringJava:按输入字符串的标记读取标记
【发布时间】:2017-01-25 11:18:07
【问题描述】:

我使用 Scanner 类作为标准输入来从键盘读取输入。 我会逐个令牌读取字符串插入,直到行尾。 记号用空格隔开。

这是我的代码:

Scanner in = new Scanner(System.in);

    int count=0;
    while(in.hasNextLine()){
        while(in.hasNext()){
            String s=in.next();
            System.out.println(s);
            if(s.equals("\n")) 
             break;
            count++;
        }
        break;
    }
    System.out.println(count);

问题在于,当我按下回车键时,它似乎将其视为一个空格,并且它永远不会从 while 块中退出,因此它继续期待另一个输入。

在 Linux 中退出 while 并结束程序的唯一方法是按 ctrl+D (=enter),但我正在寻找另一种方式...

我尝试插入一个 if 语句来检查令牌是否为“\n”,但它不起作用。

你能帮我找到解决问题的办法吗?

【问题讨论】:

  • 该计划的目标是什么?
  • 对不起,程序必须计算字符串中有多少个单词。我知道我可以通过其他方式来做到这一点,例如拆分字符串、放入数组并获取数组的长度,但我正在尝试理解 .hasNext() 方法...

标签: java input java.util.scanner token


【解决方案1】:

in.hasNextLine() 和 in.hasNext() 方法在与流一起使用时是阻塞的:如果没有新行或新标记,它们将等到你写了一些东西并再次按 Enter 键。

如果你只想要一行,你可以使用类似的东西:

package test;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        int count=0;
        Scanner in =new Scanner(System.console().readLine()); //scanning just one line
        while(in.hasNext()){
            String s=in.next();
            System.out.println(s);
            count++;
        }
        System.out.println(count);
        in.close();
    }

}

注意: 如果从 IDE 执行此代码,则没有控制台,因此 System.console() 返回 null。为了从命令行运行它,您需要输入如下内容:

$ pwd
/home/user/development/workspace/test/bin
$ ls
test
$ ls test
Test.class
$ java -classpath /home/user/development/workspace/test/bin/ test.Test

【讨论】:

  • 它给了我这个异常:线程“main”java.lang.NullPointerException中的异常
  • 我猜你是从 IDE 执行它,检查我的更新
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多