我有以下代码:
if (maxLength>=0 && (++totalLength > maxLength))
throw new IllegalStateException("Form too large");
在一个循环中,从字节数组输入流中读取字节。 maxLength
设置为Integer.MAX_VALUE
所以我认为条件永远不会成立(我不是在谈论输入流中字节数组的大小,我绝对不确定足够)。但我从那条线上抛出了IllegalStateException
!现在真正无赖的是,当我在该投掷线上设置断点时,一切都很好。这到底怎么可能?
修改:
上面的代码在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);
答案 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吗?或者它是最终的?