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 应用程序时,它输出“true”。告诉我们股票代码已加载。但是当我调试java应用程序时,它进入了else。我不明白为什么它以这种方式运行,尤其是为什么它在我第一次运行应用程序时输出“真”。谁能帮帮我,谢谢~

4

4 回答 4

0

如果该函数已多次运行,则 getCodes() 函数实质上会缓存结果。第一个 getCodes() 不会打印“true”,但所有后续调用都会

从命令行运行

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

这应该不会向 STDOUT 输出任何内容。

于 2012-04-23T04:05:12.327 回答
0

使用上面给出的代码,默认情况下控件应该始终进入else块中并且不打印任何内容。你可以验证它。

不是,如果您有更多的地方调用该getCodes()方法,那么它会有所不同。话虽如此,请验证是否没有其他地方可以调用getCodes()。即它通过单次调用main()

于 2012-04-23T04:05:14.590 回答
0

你的if陈述很干净。当我遇到这些类型的错误之一时,我会走旧的时尚路线。我放了一系列

System.out.println

代码的该部分中的语句以跟踪您的代码在不处于调试模式时的去向。它很笨重,但它有效。

于 2012-04-23T04:13:37.633 回答
0

当我运行您的代码时,它会经历else我是在调试模式下运行还是在常规模式下运行。

我认为您丢失了一行代码。你有 System.out.println(StockCodes.loaded); 在你的else分支也?如果你这样做了,并且你把它放在你的线下面,StockCodes.loaded = true;那么它将true为你打印。

I suggest you use more detailed debugging, something like System.out.println("In the if branch"); and below that in the else branch, a line like System.out.println("In the else branch"); I think you are tricking yourself by having too little output.

于 2012-04-23T04:14:16.090 回答