2013-11-05 46 views
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 properties22Tokens;

我試圖在下面的主要方法中打印標記..但沒有標記.. 這是吃令牌嗎?

public static void main(String arg[]) { 

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

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

} 

輸出是 - 從化子性質的一些標記+主..

我的預期輸出 - 從主.. +從性能有一定的令牌

可能有人特性+一些標記請修復並解釋修復?

回答

0

你在靜態塊中「吃」了它們全部。到main發生時,while(properties22Tokens.hasMoreTokens())將是錯誤的。

+0

是的,這是虛假的..但爲什麼? – user2954791

+0

謝謝湯姆...但是如果我想在同一個類的同一個變量上用不同的方法迭代幾次,那麼最好的做法是什麼? – user2954791

+0

您需要每次從屬性值創建新的'StringTokenizer'。 –

0

StringTokenizer類將令牌中的字符串分解,令牌可以使用nextToken方法進行迭代。正如你所使用下面的循環遍歷靜態塊中的所有令牌:

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

所以hasMoreTokens任何進一步的調用將返回false。因此,main方法中的while循環從不執行。

+0

感謝您的解釋..我修復並將我的令牌分配給數組變量以在需要的地方重複使用。 – user2954791

2

是的,湯姆是對的。你在靜態塊中「吃」了它們。
以下代碼段返回false。
而(properties22Tokens.hasMoreTokens()){
.......
}

現在的問題是爲什麼?
因爲我們將創建StringTokenizer的對象並填充它。它會創建兩個變量。一個用於StringTokenizer對象的標記的總大小。其次檢查有多少令牌已經送達給你。
在通過stringTokenizer調用hasMoreTokens()時,它會比較變量值和返回布爾值,它可能是true或false。
當通過stringTokenizer調用nextToken()時,它會增加變量的值,該變量是爲知道有多少令牌被服務而創建的。

相關問題