【问题标题】:why my static variable is not available in main method?为什么我的静态变量在 main 方法中不可用?
【发布时间】:2013-11-15 20:42:15
【问题描述】:

我不知道我是否在从事 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;

我正在尝试在下面的 main 方法中打印标记..但是没有标记.. 哪个在吃令牌?

public static void main(String arg[]) {

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

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

}

输出是 - 来自propeties + in main..的一些标记。

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

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

【问题讨论】:

    标签: java methods static block main


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你在静态块中“吃掉”了它们。当main 发生时,while(properties22Tokens.hasMoreTokens()) 将是错误的。

      【讨论】:

      • 是的,这是错误的..但是为什么呢?
      • 谢谢汤姆……但是如果我想用不同的方法在同一个类中的同一个变量上迭代几次,最好的做法是什么?
      • 您每次都需要从属性值创建一个新的StringTokenizer
      【解决方案3】:

      StringTokenizer 类在标记中分解字符串,标记可以使用nextToken 方法进行迭代。当您使用以下循环遍历静态块中的所有标记时:

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

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

      【讨论】:

      • 感谢您的解释..我修复了我的令牌并将其分配给一个数组变量,以便在我需要的任何地方重用..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2018-10-27
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多