[JAVA] MalformedInputException, die auch beim Schreiben auftritt

Das von mir geschriebene Java-Programm gab den folgenden Fehler aus.

Caused by: java.nio.charset.MalformedInputException: Input length = 1
	at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
	at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:306)
	at java.base/sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
	at java.base/sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
	at java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:211)
	at java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
	at java.base/java.io.BufferedWriter.flush(BufferedWriter.java:256)
(Im Folgenden wird der Stack-Trace-Teil des Anwendungscodes weggelassen.)

Es ist leicht zu erkennen, dass es sich um ein Problem mit der Zeichenkodierung handelt, aber ich kann mir keinen Grund vorstellen, wenn ich mir den relevanten Teil des folgenden Anwendungscodes anschaue.

File file = ...;
try (BufferedWriter writer = java.nio.file.Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
    String s = ...;
    writer.write(s);
    writer.flush(); //Ich erhalte hier eine Fehlermeldung, daher ist das letzte Schreibargument verdächtig...
}

In solchen Fällen ist es üblich, das s in der Zeichenfolge abzulegen und den Inhalt des s zu untersuchen.

System.err.println("[" + s + "]");

Dann wurde es wie folgt angezeigt. Was ist? Ist es verstümmelt? Gibt System.err # println überhaupt keinen Fehler aus?

[?]

Es war ein Umweg, den ich [Ersatzpaar] nicht sofort bemerkte (https://qiita.com/wingsys/items/81d46451d8b93ab065de). Als ich jedes Zeichen von s mit dem folgenden Code nachgeschlagen habe, habe ich "Hoch" erhalten. Dies ist die Ursache für den ersten Fehler.

for (char c : s.toCharArray()) {
    if (Character.isHighSurrogate(c)) {
        System.err.println("High.");
    }
    if (Character.isLowSurrogate(c)) {
        System.err.println("Low.");
    }
}

Ist Java-Programmierung ab 2020 eine gängige Praxis, bei der Ersatzpaare angemessen berücksichtigt werden?

Recommended Posts

MalformedInputException, die auch beim Schreiben auftritt
Vermeiden Sie die Verweigerung von Berechtigungen, wenn Sie Laravel mit Docker entwickeln