2012-04-23 5 views
0

У меня есть класс, как этотява статический метод

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()'? –

+0

В обоих случаях - что вы делаете? Из того, что вы нам показали, эта программа никогда не должна выводить значение true, но похоже, что вы отлаживаете, пропустив основной метод и когда вы запускаете Java-приложение, что-то еще установило StockCodes = true перед выходом. – dfb

+0

Я не вижу никакого преимущества использования переменной boolean. Вместо этого вы можете использовать метод init (резонанс - это когда вы устанавливаете логическую переменную в истинное состояние, она остается правдой навсегда) –

ответ

0

С кодом, приведенным выше, элемент управления по умолчанию всегда должен находиться в блоке else и ничего не печатать. Вы можете это проверить.

Нет, если у вас есть еще несколько мест, где вы вызываете метод getCodes(), то он будет отличаться. Сказав это, пожалуйста, проверьте, нет ли другого места с вызовом getCodes(). т.е. его вызывается единовременно через main()

0

Функция getCodes() по существу кэширует результат, если функция была запущена более одного раза. Первые getCodes() не будет печатать «истинный», но все последующие вызовы будут

Выполнить из командной строки

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

это должен вывести ничего STDOUT.

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");. Думаю, вы обманываете себя, имея слишком маленький выход.