遇到下划线时,java.io.StreamTokenizer生成空标记

遇到下划线时,java.io.StreamTokenizer生成空标记,java,stream,null,tokenize,java-io,Java,Stream,Null,Tokenize,Java Io,我有一个用于解析标记的StreamTokenizer。当我将以下内容传递给stdin时: a b_c d 解析的令牌(在stdout上)是: 为什么会这样?如果下划线是单词字符,则应该有3个标记,第二个标记为“b_c”。如果下划线是分隔符,则应该有4个标记。我认为空标记没有意义 问题1:为什么有空令牌 问题2:为什么有人会设计一个StreamTokenizer来生成空令牌 表意文字: 从文档: 如果当前标记是单词标记,则此字段包含字符串 给出单词token的字符。当当前令牌是 带引号的字符串标

我有一个用于解析标记的StreamTokenizer。当我将以下内容传递给stdin时:

a b_c d
解析的令牌(在stdout上)是:

为什么会这样?如果下划线是单词字符,则应该有3个标记,第二个标记为“b_c”。如果下划线是分隔符,则应该有4个标记。我认为空标记没有意义

问题1:为什么有空令牌

问题2:为什么有人会设计一个StreamTokenizer来生成空令牌

表意文字:

从文档:

如果当前标记是单词标记,则此字段包含字符串 给出单词token的字符。当当前令牌是 带引号的字符串标记,此字段包含字符串的主体。这个 当ttype字段的值为TT_字时,当前标记为字。 当ttype的值 字段是引号字符

此字段的初始值为空

这意味着不满足任何条件,并且输出了
null

换句话说,下划线的ttype既不是单词也不是带引号的字符串

t类型的文档指定

调用nextToken方法后,此字段包含 令牌刚刚读取。对于单个字符标记,其值为 单个字符,转换为整数。对于带引号的字符串标记, 它的值是引号字符。否则,它的值是 following:TT_WORD表示标记是一个单词。TT_数 指示令牌是一个数字。TT_EOL表示 这一行已经读过了。只有当 已使用参数true调用了eolIsSignificant方法。TT_EOF 指示已到达输入流的结尾

此字段的初始值为-4

请注意,-4值等于TT_NOTHING

要将下划线识别为单词,您可以使用
tokenizer.wordChars(“'u',''u')


wordChars用于指定low范围内的所有字符c可能我的标记概念有点偏斜,但我认为标记器应该能够为每个字符确定它是标记的一部分还是分隔符。。。(仍然缺少第二季度的答案)几乎。。。我想知道为什么有人设计了它,所以在标记/分隔符中没有字符。有什么目的吗?(除了让NullPointerException让我知道还有另一个未知字符)@mirelon正如我所说,下划线被设计为标识符的一部分。因此,当满足此条件时,如果未标识标识符,则没有任何内容是mappend,并且返回null。这可能会返回NPE,但是NPE比意外行为更容易测试(例如,如果您输入了错误的标识符)。好的,所以我明显缺少字符流上下文中“标识符”的概念。。。你能解释一下吗?@mirelon identifier这里只是我使用的一个随机术语。您必须理解的是,默认情况下,下划线不在任何范围内(请参阅我发布的构造函数)。因此,考虑到下划线不应被接受,如果不重新定义默认值,它将以这种方式工作。在我看来,这样做的原因不是抛出null和NPE,而是为了在读取非预期值时使其更加明显。但这并不是很重要,因为像您想要完全使用的任何其他程序一样,标记器应该设置适合您需要的自定义值。
a
b
null
c
d
import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer st = new StreamTokenizer(br);
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println(st.sval);
        }
    }
}
private StreamTokenizer() {
    wordChars('a', 'z');
    wordChars('A', 'Z');
    wordChars(128 + 32, 255);
    whitespaceChars(0, ' ');
    commentChar('/');
    quoteChar('"');
    quoteChar('\'');
    parseNumbers();
}