2012-04-23 176 views
0

我有這樣Java靜態方法

public class StockCodes 
{ 

    public static boolean loaded = false; 
    public static long lastUpdate = 0; 
    private static long freq = 1000 * 60 * 60 * 24; 
    public static HashMap<String, Stock> stockMap = new HashMap<String, Stock>(); 

    public static ArrayList<Stock> getCodes() 
    { 
     long now = System.currentTimeMillis(); 
     if ((StockCodes.loaded) && ((now - StockCodes.lastUpdate) < freq)) 
     { 
      System.out.println(StockCodes.loaded); 
      return stockList; 

     } 
    else 
     { 
      HttpFetcher fetcher = new HttpFetcher(); 

     .... 

      log.info("Load " + stockList.size() + " Stocks"); 
      StockCodes.loaded = true; 
      StockCodes.lastUpdate = now; 
      return stockList; 
     } 
    } 


    public static void main(String[] args) 
    { 
     StockCodes.getCodes(); 
    } 
} 

類當我運行Java應用程序,它輸出「真」。告訴我們這些股票代碼已經加載。 但是,當我調試Java應用程序,它進入其他。我不明白爲什麼它會以這種方式運行,尤其是爲什麼我第一次運行應用程序時會輸出「true」。可能有人給我一些幫助,謝謝〜

+0

「'....'」中有什麼?可能是'StockCodes.getCodes()'調用? – 2012-04-23 03:58:44

+0

在這兩種情況下 - 你在做什麼?從你告訴我們,這個程序不應該輸出真,但它看起來像通過運行main方法進行調試,並且當你在退出之前運行java應用程序'其他的設置了StockCodes = true時。 – dfb 2012-04-23 03:59:56

+0

我沒有看到使用布爾變量的任何優勢。相反,您可以使用init方法(一旦將布爾變量設置爲true狀態,​​它就會永遠保持真實) – 2012-04-23 04:18:50

回答

0

使用上面給出的代碼,默認情況下的控制應始終在else塊中,並且不進行任何打印。你可以驗證它。

不是如果你有更多的地方你調用getCodes()方法,那麼它會有所不同。說了這些之後,請確認是否沒有其他地方與getCodes()聯繫。即它的引用單次通過main()

0

getCodes()函數本質上緩存結果,如果函數已經運行多次。第一getCodes()將無法打印「真」,但所有後續調用命令行

public static void main(String[] args) 
{ 
    StockCodes.getCodes(); 
} 

這應該輸出什麼到標準輸出將

運行。

0

您的if聲明是乾淨的。當我遇到這種類型的錯誤時,我會走老路。我把一系列

System.out.println 

語句代碼的那一段跟蹤,你的代碼是怎麼回事時,它不是在調試模式。這是笨重的,但它的作品。

0

當我運行你的代碼時,它通過else是否在調試模式或常規運行。

我想你丟了一行代碼。你有沒有 System.out.println(StockCodes.loaded); 在你的else分支也?如果你這樣做了,並且它位於線條StockCodes.loaded = true;的下方,那麼它將爲您打印true

我建議你使用更詳細的調試,像System.out.println("In the if branch");並低於else分支,像System.out.println("In the else branch");一條線,我認爲你是有太少輸出欺騙自己。