0

我不知道即使在从事 Java 工作几年后我是否忘记了我的基础知识。

我有一个有静态块的类

static {
    Properties prop = new Properties();
    try {
        prop.load(new FileInputStream("PATH OF PROPERTIES FILE"));
        String properties22 = (String) prop.getProperty("propertyname");
        properties22Tokens = new StringTokenizer(properties22, ",");

         while(properties22Tokens.hasMoreTokens())
        {
            System.out.print(":::"+properties22Tokens.nextToken());
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我已经在该变量上声明了公共静态声明,如下所示

公共静态 StringTokenizer 属性22Tokens;

我正在尝试用下面的主要方法打印令牌..但是没有令牌..哪个正在吃令牌?

public static void main(String arg[]) {

    System.out.print("in main..");

    while(properties22Tokens.hasMoreTokens())
    {
        System.out.print(":::"+properties22Tokens.nextToken());
    }

}

输出是 - 来自属性的一些标记 + 在 main..

我的预期输出 - 来自属性的一些标记 + 在 main.. + 来自属性的一些标记

有人可以修复并解释修复吗?

4

3 回答 3

2

是的,汤姆是对的。你在静态块中“吃”了它们。
以下代码返回false。
while(properties22Tokens.hasMoreTokens()){
.......
}

现在的问题是为什么?
因为当我们将创建 StringTokenizer 对象并填充它时。它将创建两个变量。一个用于您的 StringTokenizer 对象的令牌的总大小。其次,检查已向您提供了多少代币。
在通过 stringTokenizer 调用 hasMoreTokens() 时,它将比较变量值并返回布尔值,它可能是 true 或 false。
并且当通过 stringTokenizer 调用 nextToken() 时,它将增加变量的值,该变量是为了知道已经提供了多少令牌而创建的。

于 2014-06-24T06:13:11.293 回答
0

StringTokenizer 类打破标记中的字符串,并且可以使用nextToken方法迭代标记。当您使用以下循环遍历静态块中的所有标记时:

while(properties22Tokens.hasMoreTokens())
{
    System.out.print(":::"+properties22Tokens.nextToken());
}

所以任何进一步的调用hasMoreTokens都会返回false。因此,您while的方法中的循环main永远不会执行。

于 2013-11-05T02:54:40.973 回答
0

你在静态块中“吃”了它们。到时候main发生,while(properties22Tokens.hasMoreTokens())就会是假的。

于 2013-11-05T02:51:39.897 回答