gpt4 book ai didi

java - openjdk中的数组长度变化

转载 作者:IT王子 更新时间:2023-10-29 00:20:45 30 4
gpt4 key购买 nike

我最近在我的应用程序中看到了我无法真正解释的奇怪行为。它们出现的频率非常低,所以我无法重现它们。虽然这些问题发生的地方发生了变化,但共同点似乎是数组在创建后改变了大小(我知道,这是不可能的,因此:奇怪的行为)。

举几个例子来阐明我的观点:

java.lang.StringIndexOutOfBoundsException: String index out of range: 86
at java.lang.String.checkBounds(String.java:409)
at java.lang.String.<init>(String.java:577)
at com.acunia.fleet.diagnostics.providers.tacho.VDOKLineInputParser.getRealDriverID(Unknown Source)

导致这种情况的代码:

public String getRealDriverID(byte[] buffer) {
if (buffer.length > 86 && isDriverCardInserted(buffer)) {
return new String(buffer, 70, 16);
}
return null;
}

所以我们首先检查缓冲区是否足够大(超过 86 字节),然后再尝试从中创建一个字符串。

第二个例子:

java.lang.ArrayIndexOutOfBoundsException: -1
at java.lang.String.lastIndexOf(String.java:1889)
at java.lang.String.lastIndexOf(String.java:1835)
at java.lang.String.lastIndexOf(String.java:1817)
at com.acunia.service.position.nmea.comm.CommPositionProvider.isValid(Unknown Source)

导致这个异常的行是:

int csi = line.lastIndexOf("*");

我查看了 openjdk String.java 源代码,但找不到错误,除非数组在创建后突然开始改变大小。

我能找到的唯一可能相关的在线引用是一个 openjdk 错误:https://bugs.openjdk.java.net/browse/JDK-6817012 .虽然这个错误被标记为“不是问题”,但在阅读本文时我无法真正判断所提到的问题是否未被识别为错误,或者关闭错误的人是否不明白为什么会出现此错误会引起问题。

如果有人遇到过类似的问题,我将不胜感激。目前这个问题太不稳定了,无法尝试使用其他版本的 openjdk 来修复它。

问题出现在:

hardware: custom arm platform
java version "1.6.0_31"
OpenJDK Runtime Environment (IcedTea6 1.13.3) (6b31-1.13.3-1~deb7u1)
OpenJDK Zero VM (build 23.25-b01, mixed mode)
Linux 3.2.0 #1 Fri Jun 20 10:25:16 CEST 2014 armv7l GNU/Linux

最佳答案

这很可能是字节和系统字符集的问题。 The documentation明确地说:

The behavior of this constructor when the given bytes are not valid in the default charset is unspecified.

您可以通过显式提供正确的字符集来规避此问题:

new String(buffer, 70, 16, StandardCharsets.UTF_8)

关于java - openjdk中的数组长度变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167827/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com