Integer.MAX_VALUE是否存在任何并行问题

时间:2011-03-03 14:16:34

标签: java

我有以下代码:

if (maxLength>=0 && (++totalLength > maxLength))
    throw new IllegalStateException("Form too large");

在一个循环中,从字节数组输入流中读取字节。 maxLength设置为Integer.MAX_VALUE所以我认为条件永远不会成立(我不是在谈论输入流中字节数组的大小,我绝对不确定足够)。但我从那条线上抛出了IllegalStateException!现在真正无赖的是,当我在该投掷线上设置断点时,一切都很好。这到底怎么可能?

修改

  • 两个变量都是int
  • 类型
  • totalLength是局部变量,maxLength是参数
  • 调试器不会停在那里并且当该抛出线上有断点时,根本不会抛出异常。
  • 我实际上不知道为什么我怀疑并行性,这只是因为它是web应用程序
  • 我承认使用MAX_VALUE是非常危险的(在下一步中我将尝试减少此限制),但我希望在if语句的success分支中有一些其他的execption。此外,输入流中使用的字节数组实际上还不够长。这应该是JVM中显然不可能的情况: - )。
  • 上面的代码在UrlEncoded类中的jetty-util-7.1.5.v20100705.jar中,我通过调用

    来使用它
    byte[] decodedBytes;
    byte[] encodedBytes;
    
    // v pripade url encoded requestu je potreba pouze odriznout
    // jmeno falesneho parametru nesouciho kodovany blok
    encodedBytes = Arrays.copyOfRange(content, "encdata=".length(), content.length);
    decodedBytes = decodeBytes(request, encodedBytes);
    
    // priprav desifrovany text jako vstupni proud
    decodedInputStream = new ByteArrayInputStream(decodedBytes);
    
    // pokud je request url encoded je potreba jej manualne parsovat
    // pro potreby funkci vracejicich parametry
    UrlEncoded.decodeTo(decodedInputStream, parameters, request.getCharacterEncoding(), Integer.MAX_VALUE);
    

3 个答案:

答案 0 :(得分:2)

  

Integer.MAX_VALUE

是否存在任何并行问题

不,这很可能不是因为任何竞争条件(除非你有其他线程修改maxLength左右)。

根据整数上的JLS大于Integer.MAX_VALUE所以这可能是由于您的VM中的错误或基于maxLength确实是Integer.MAX_VALUE的错误假设。

  

maxLength设置为Integer.MAX_VALUE所以我认为条件永远不会是真的

确保totalLength不是long

(下面的代码片段总是抛出异常。)

int maxLength = Integer.MAX_VALUE;

long totalLength = 2147483647;

if (maxLength>=0 && (++totalLength > maxLength))
    throw new IllegalStateException("Form too large");

如果调试器无法重现,只需向异常提供更具信息性的错误消息,例如:"Form too large: " + totalLength + " is larger than " + maxLength

答案 1 :(得分:1)

您确定要在比较之前增加totalLength,而不是之后吗?如果进入该语句的totalLength等于maxLength,则抛出异常......这是一种可能的情况吗?

尝试使用totalLength ++。

只是一个想法。希望这会有所帮助。

答案 2 :(得分:0)

  

现在真正令人沮丧的是,当我在该投掷线上设置断点时,一切都很好

你的意思是调试器不止于此吗?

从您的问题标题中,您似乎怀疑是竞赛条件(多线程)问题。 如何定义变量? 你能发布更多代码吗?

可以在别处修改maxLength吗?或者它是最终的?