Java Integer.MAX_值是否存在任何并行问题

Java Integer.MAX_值是否存在任何并行问题,java,Java,我有以下代码: if (maxLength>=0 && (++totalLength > maxLength)) throw new IllegalStateException("Form too large"); 在从字节数组输入流读取字节的循环中。maxLength被设置为Integer.MAX\u VALUE,因此我认为该条件永远不可能为真(我不是在谈论输入流中字节数组的大小,我绝对肯定它不够长)。但是我从那一行中抛出了IllegalStateExce

我有以下代码:

if (maxLength>=0 && (++totalLength > maxLength))
    throw new IllegalStateException("Form too large");
在从字节数组输入流读取字节的循环中。
maxLength
被设置为
Integer.MAX\u VALUE
,因此我认为该条件永远不可能为真(我不是在谈论输入流中字节数组的大小,我绝对肯定它不够长)。但是我从那一行中抛出了
IllegalStateException
!!!现在真正让人沮丧的是,当我在罚球线上设置断点时,一切都正常。这怎么可能

编辑

  • 这两个变量都是int类型的
  • totalLength是一个局部变量,maxLength是一个参数
  • 当抛出行上有断点时,调试器不会停止,并且根本不会抛出异常
  • 我真的不知道为什么我会怀疑并行性,因为它是web应用程序
  • 我承认使用MAX_值是非常危险的(在下一步中,我将尝试降低此限制),但我希望除了if语句的success分支中的执行之外,还有其他一些执行选项。而且,输入流中使用的字节数组确实不够长。这在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);
    

您确定要在比较之前而不是之后增加总长度吗?如果进入该语句的totalLength等于maxLength,将引发异常。。。这是一种可能的情况吗

改为尝试totalLength++

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

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

不,这很可能不是由于任何竞争条件造成的(除非您有其他线程修改
maxLength
左右)

根据JLS,整数大于
integer.MAX_值
,因此这可能是由于VM中存在错误,或者基于错误的假设,
maxLength
确实是
integer.MAX_值

maxLength设置为Integer.MAX\u值,因此我认为该条件永远不会为真

确保
totalLength
不是
long

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

如果调试器无法再现该异常,只需向异常提供更详细的错误消息,例如:
“Form too large:“+totalLength+”大于“+maxLength

现在真正让人沮丧的是,当我在罚球线上设置断点时,一切都正常

你的意思是调试器不会就此停止吗

从您的问题标题来看,您似乎怀疑存在赛车条件(多线程)问题。 变量是如何定义的? 你能再发一些代码吗


maxLength可以在其他地方修改吗?或者它是最终的?

嘿,如果
totalLength
int
类型,您的评论是不正确的。如图所示,您是否使用
++totalLength
totalLength++
并不重要。在这两种情况下都不会抛出。您确实意识到在上面的(现在更新的)代码中,totalLength在数字上等于max int值。。。如果我没记错的话,因为总长度是长的,所以最大长度不会被提升为长吗?如果将++放在totalLength之后,它将在递增之前进行比较。请用行号发布异常stacktrace和更多代码。+1因为如果调试器无法复制,只需向异常提供更详细的错误消息,例如:“Form Total large:+totalLength”。您也应该在那里输出maxLength,以避免在此处更改此值的问题。同意。相应地更新了答案。
int maxLength = Integer.MAX_VALUE;

long totalLength = 2147483647;

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