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);
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");