为什么我的静态变量在main方法中不可用?

时间:2013-11-05 02:48:49

标签: java methods static block main

我不知道即使在使用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();
    }
}

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

public static StringTokenizer properties22Tokens;

我试图在下面的主要方法中打印令牌..但是没有令牌.. 哪个吃了代币?

public static void main(String arg[]) {

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

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

}

输出是 - 来自主要的一些标记+在主..

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

有人可以修理并解释修复程序吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

你在静态块中“吃掉”它们。到main发生时,while(properties22Tokens.hasMoreTokens())将为假。

答案 2 :(得分:0)

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

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

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