Java 超时异常

Java 超时异常,java,Java,这是我下面的代码,我不明白为什么会发生这种事情。在这段代码中,getLocationTimeout是一个方法,在该方法中,我传递了两个内容—一个是ip地址,另一个是以毫秒为单位的超时。因此,在这种特殊情况下,如果响应没有在5毫秒内返回,我将得到超时异常。所以,当我运行下面的代码时,我得到了一些ip地址的超时异常。这意味着一些响应需要更长的时间(大于5毫秒),但我最困惑的是,如果我遇到超时异常(获取响应所需的时间大于5毫秒),那么为什么程序会进入差异大于5的if循环。它应该在前面的位置引发超时异常

这是我下面的代码,我不明白为什么会发生这种事情。在这段代码中,getLocationTimeout是一个方法,在该方法中,我传递了两个内容—一个是ip地址,另一个是以毫秒为单位的超时。因此,在这种特殊情况下,如果响应没有在5毫秒内返回,我将得到超时异常。所以,当我运行下面的代码时,我得到了一些ip地址的超时异常。这意味着一些响应需要更长的时间(大于5毫秒),但我最困惑的是,如果我遇到超时异常(获取响应所需的时间大于5毫秒),那么为什么程序会进入差异大于5的if循环。它应该在前面的位置引发超时异常。可能的原因是什么?是因为挡块吗?如有任何建议,将不胜感激

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毫秒的响应,它都应该打印出超时异常。但在某些情况下,它正在打印调试,但没有打印超时异常,在调试器的帮助下,我发现如果差异在6或8左右,则我看到指针进入调试的if循环。

如果我理解您的问题,然后,是的,您正在try…catch块中调用getLocationByIpTimeout,因此任何抛出的异常都将被捕获、处理(在您的情况下,通过登录到Sysout,然后程序将继续进入if块-这就是您看到的问题-您希望发生什么?

您需要在循环的顶部或在最后的“else”块中将“difference”设置为零。目前,可以重用以前的值。

好的,谢谢添加信息-tho我认为这是一个不同的答案,因为这是一个不同的策略。因此,从你添加的信息来看,我认为额外的时间似乎只是因为额外的尝试捕捉等指令的运行(我认为)但是,也许你应该重新审视一下代码。GooLoistPyIpTimeOutle调用了你需要的所有时间,所以你可以在catch块中做任何你需要的逻辑,也就是说,你不需要所有的时间素材——这会满足你的需要吗?< /P>你在几个循环之后看到了吗?你可能想考虑SC。变量的作用域-它们是否需要在循环外声明?不,这不是我的问题。该方法有两个参数,一个是ip地址,第二个是超时。因此,如果响应返回的时间小于5毫秒,则该方法很好。但如果所用时间较长,则意味着大于5毫秒,则会抛出超时异常。因此,我是calc计算时间差。所以我的问题是,为什么程序会进入if循环
if(difference>5)
,它应该在前面的位置抛出超时异常。你是说你看到一些没有“超时异常”的“调试”打印输出吗打印输出?啊-我在哪种情况下看变量,它们在每个循环中都没有被重新初始化,所以我认为你可能会从一个循环到下一个循环,我不这么认为,这可能是问题所在。因为每次他们为每个特定的query.OT使用System.nanoTime,但是对于任何网络操作来说5ms都是一个可笑的短超时通过使用调试器,我发现它没有使用任何以前的值。这可能是因为catch块。可能是响应在5毫秒内返回。但它正在catch块中打印。所以这需要额外的时间。然后我会计算之后的差值?@RaihanJamal在sl中无所谓您在调试器中看到的最正确。如果没有此修复,您的代码是错误的。您所说的我知道。我已经在while循环上有了差0。我还应该在哪里将差设置为零。@RaihanJamal我已经回答了这个问题。在该条件下,您没有最终的“else”,因此可能不分配“difference”在循环中一点都没有。这是显而易见的吗?