Ich habe kürzlich seltsames Verhalten in meiner Anwendung gesehen, das ich nicht wirklich erklären kann. Sie kommen sehr selten vor, so dass ich sie nicht reproduzieren kann. Während der Ort, an dem diese Probleme auftreten, sich ändert, scheint der allgemeine Teil zu sein, dass ein Array seine Größe ändert, nachdem es erstellt wurde (ich weiß, das ist nicht möglich, daher: seltsames Verhalten).
Ein paar Beispiele, um klarzustellen:
%Vor%Der Code, der dies verursachen würde:
%Vor%Wir prüfen zuerst, ob der Puffer groß genug ist (mehr als 86 Bytes), bevor wir versuchen, einen String daraus zu erstellen.
Ein zweites Beispiel:
%Vor%Die Zeile, die diese Ausnahme verursacht, ist:
%Vor%Ich habe mir die Quelle openjdk String.java angeschaut, konnte aber keinen Fehler finden, es sei denn, Arrays könnten nach der Erstellung plötzlich die Größe ändern.
Die einzige Online-Referenz, die ich vielleicht gefunden habe, war ein openjdk-Fehler: Ссылка . Dieser Fehler wurde als "kein Problem" markiert, obwohl ich beim Lesen nicht wirklich sagen kann, ob das Problem, das erwähnt wird, nicht als Fehler erkannt wird, oder ob die Person, die den Fehler geschlossen hat, diesen Fehler nicht sieht würde Probleme verursachen.
Wenn jemand jemals auf ein ähnliches Problem gestoßen ist, würde ich es sehr schätzen, davon zu hören. So wie es aussieht, ist das Problem zu instabil, um es mit anderen Versionen von openjdk zu beheben.
Problem wurde bei:
gesehen %Vor%Dies ist höchstwahrscheinlich ein Problem mit den Bytes und dem Systemzeichensatz. Die Dokumentation sagt ausdrücklich:
Das Verhalten dieses Konstruktors, wenn die angegebenen Bytes im Standardzeichensatz nicht gültig sind, lautet unspezifiziert .
Sie können dies umgehen, indem Sie explizit den korrekten Zeichensatz angeben:
%Vor% Sie erstellen das neue String
mit dem Array byte[]
ohne Angabe von Charset
. Also meine Vermutung ist, dass System-Standard-Zeichensatz geändert wurde und Sie das Verhalten Änderungen sehen. Ich würde vorschlagen, den Zeichensatz immer explizit anzugeben. Zum Beispiel: