OutOfMemoryError: Java-Heap-Speicher, wenn ein numerisches Primitiv in char umgewandelt wird

8

Ich habe Decorator Muster studiert und einfache Klasse ToUpperCaseInputStream entwickelt. Ich habe die read () -Methode überschrieben, damit alle Zeichen von InputStream in Großbuchstaben konvertiert werden können. Code der Methode wird unten angezeigt (wirft OutOfMemoryError):

%Vor%

Wie ich später gesehen habe, ist das Gießen von Saibling überflüssig, aber darum geht es nicht. Ich habe "java.lang.OutOfMemoryError: Java-Heap-Space", wenn der Code:

%Vor%

wertet aus. Um dies einfacher zu machen, schrieb ich die gleiche Methode (diese wirft OutOfMemoryError):

%Vor%

Und das tut es nicht:

%Vor%

Wenn ich das Casting aus der Zuweisung entferne, läuft der Code ohne Fehler und führt dazu, dass der gesamte Text in Großbuchstaben erscheint. Wie es bei Oracle-Tutorials heißt:

Eine Zuweisung zu einer Array-Komponente vom Referenztyp (§15.26.1), ein Methodenaufrufausdruck (§15.12) oder ein Präfix- oder Postfixinkrement (§ 15.14.2, §15.15.1) oder Dekrementierungsoperator (§15.14.3, §15.15.2) darf alle einen OutOfMemoryError als Ergebnis der Boxenkonvertierung werfen (§5.1.7).

>

Es scheint, dass Autoboxing verwendet wird, aber für mich ist das nicht der Fall. Beide Varianten der gleichen Methode führen zu OutOfMemoryError. Wenn ich falsch liege, bitte erkläre mir das, denn es wird meinen Kopf in die Luft jagen.

Um weitere Informationen zur Verfügung zu stellen, gibt es den Client-Code:

%Vor%

}

Es wird nur eine einfache Nachricht von einer Datei in eine andere gedruckt.

Obwohl der Fall gelöst ist, möchte ich eine wirklich gute Erklärung dafür geben, wie Casting ausgeführt wird. Ссылка

    
Zarial 17.01.2015, 19:06
quelle

1 Antwort

4

Bevor Sie in char umwandeln, müssen Sie nach -1 suchen (Signalisierung des Endes der Eingabedaten).

char in Java ist eine unsignierte Abkürzung, dh wenn -1 zurückgegeben wird, wird Ihr Cast 65535. Selbst wenn Sie OutOfMemory nicht hatten, ist Ihr Code immer noch kaputt.

In Bezug darauf, warum Sie einen OOM-Fehler bekommen, ist es schwer, ohne vollständigen Code zu sagen, vielleicht gibt es später im Code einige Speicherzuweisungen, die auf dem Wert des Zeichens basieren.

Versuchen Sie es also und sehen Sie, ob es hilft:

%Vor%     
yurgis 17.01.2015, 19:51
quelle