[英]Java11, what shall MalformedByteSequenceException be replaced with?
我正在將項目轉移到 Java11
我已經改變了sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
與java.lang.reflect.ParameterizedType
(作為指定在這里),現在之交MalformedByteSequenceException
:
警告:MalformedByteSequenceException 是內部專有 API,可能會在未來版本中刪除 import com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException;
它被用於從 XML 文件創建對象的代碼片段中。 更准確地說是在try-catch
。
try {
...
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(stream);
NodeList list = document.getChildNodes();
fillProcessStack(document);
...
list = list.item(0).getChildNodes();
createItems(list, parent);
} catch (MalformedByteSequenceException e) {
//"Any char in your xml file has a wrong format: " + e.getLocalizedMessage()
} catch (SAXParseException sax) {
...
} catch (Exception e) {
...
}
無論如何,我在網上找不到任何關於此的信息。
我能想到的最接近的是UnsupportedEncodingException
,但我不確定。
此外,這可能是從網上復制的一些舊代碼的殘余,顯然如果我刪除它,對於編譯器來說一切看起來仍然很好。
那么,關於 Java11 有沒有關於它的一般/好的建議?
編輯:對於尋求關閉此問題的人,因為
尋求調試幫助的問題(“為什么此代碼不起作用?”)必須包括所需的行為、特定問題或錯誤以及在問題本身中重現它所需的最短代碼。 沒有明確問題陳述的問題對其他讀者沒有用處。 請參閱:如何創建最小的、可重現的示例。
我會盡量解釋得更清楚。
這里沒有調試幫助,在 Java11 中有些包沒有導出到 public,比如sun.*
並且它們不應該被正常使用(除非特定條件)。 代碼在 jdk8 下工作正常,但在 ojdk11 下它會抱怨,所以我可以使用一些變通方法讓它們在運行時仍然可見,或者使其正確並擺脫它們。 后者是我正在嘗試做的。 網上沒找到,所以在這里問一下。
MalformedByteSequenceException
擴展了CharConversionException
,它擴展了IOException
, parse
方法強制您無論如何都要捕獲它。 因此,當捕獲IOException
或CharConversionException
,如果直接拋出,您也會捕獲MalformedByteSequenceException
。
但是,JDK 11 中 XML 解析器的行為似乎發生了變化。當我嘗試時,例如
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(new byte[] { 1, 2, 3, -5 }));
我得到
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Invalid byte 1 of 1-byte UTF-8 sequence.
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:262)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:122)
at TestXmlParser.main(TestXmlParser.java:14)
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at java.xml/com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:702)
at java.xml/com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:568)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1904)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1770)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1808)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:158)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:860)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
... 3 more
而不是
Exception in thread "main" com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1619)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:193)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:232)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
at TestXmlParser.main(TestXmlParser.java:14)
以前的版本。
換句話說, parse
現在拋出一個SAXParseException
,其原因初始化為MalformedByteSequenceException
。 因此,要檢測問題是格式錯誤的字節序列,請分別執行。 文本編碼錯誤,你需要類似的東西
catch(SAXException ex) {
if(ex.getCause() instanceof CharConversionException) {
System.out.println("maformed bytes or wrong encoding: "+ex.getMessage());
}
}
要處理較新和較舊的版本,您需要類似的東西
catch(CharConversionException ex) {
System.out.println("malformed bytes or wrong encoding: "+ex.getMessage());
}
catch(SAXException ex) {
if(ex.getCause() instanceof CharConversionException) {
System.out.println("malformed bytes or wrong encoding: "+ex.getMessage());
}
}
分別
catch(CharConversionException ex) {
handle(ex);
}
catch(SAXException ex) {
if(ex.getCause() instanceof CharConversionException) {
handle((CharConversionException)ex.getCause());
}
}
…
static void handle(CharConversionException ex) {
// just an example
System.out.println("malformed bytes or wrong encoding: "+ex.getMessage());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.