超时例外

时间:2012-03-19 01:58:47

标签: java

这是我的下面代码,我很困惑为什么会发生这件事。在这段代码中,getLocationTimeout是一个方法,我传递两个东西 - 一个是ip地址,第二个是以毫秒为单位的超时。因此,如果在这种特殊情况下响应没有在5毫秒内恢复,我将得到超时异常。因此,当我运行下面的代码时,我得到的几个ip地址的超时异常很少,这意味着一些响应需要更长的时间(大于5毫秒),但最重要的是我感到困惑的是如果我得到超时异常(时间)为了得到响应大于5毫秒)那么为什么程序进入那个我有差异的循环>它应该在以前的位置抛出超时异常。可能的原因是什么?这是因为陷阱?任何建议将不胜感激。

long runs = 10000;
long difference = 0;

while (runs > 0) {
    String ipAddress = generateIPAddress();
    long start_time = System.nanoTime();

    try {
        resp = GeoLocationService.getLocationTimeout(ipAddress, 5);
    } catch (TimeoutException e) {
        System.out.println("Timeout Exception");
    }

    long end_time = System.nanoTime();

    if (resp == null || (resp.getLocation() == null)) {
        difference  = 0;
    } else if (resp.getLocation() != null) {
        difference = (end_time - start_time) / 1000000;
    }

    if (difference> 5) {
        System.out.println("Debug");
    }

}

输出未预期 好。我遇到的问题是 - 对于任何大于5毫秒的响应,它应该打印超时异常。但在某些情况下,正在发生的是它正在打印Debug而没有打印Timeout Exception并且在调试器的帮助下我发现如果差异大约是6或8,那么我看到指针进入调试循环。

3 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那么你是在try ... catch块中调用getLocationByIpTimeout,所以抛出的任何异常都会被捕获,处理(在你的情况下记录到Sysout,然后是程序)将继续进入if块 - 是你看到的问题 - 你想要发生什么?

答案 1 :(得分:0)

你需要设置差异'在循环的顶部归零,或者在最后的“其他”中归零。块。目前,可以重复使用之前的值。

答案 2 :(得分:0)

好的,感谢您添加信息 - 我想我会把它作为一个不同的答案,因为它是一个不同的方法。所以从你添加的信息我觉得它看起来只是额外的时间只是来自额外的try catch等指令运行(我认为)。不过,也许你应该看看真正重做代码。 getLocationByIpTimeout调用会执行我认为需要的所有时间,因此您可以在catch块中执行所需的任何逻辑,即您不需要所有的时序 - 这将满足您的需求吗?