簡體   English   中英

Java11,MalformedByteSequenceException 應該用什么代替?

[英]Java11, what shall MalformedByteSequenceException be replaced with?

我正在將項目轉移到 Java11

我已經改變了sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpljava.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 ,它擴展了IOExceptionparse方法強制您無論如何都要捕獲它。 因此,當捕獲IOExceptionCharConversionException ,如果直接拋出,您也會捕獲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());
}

轉換 ArrayList 列表的最佳方法是什么<object>到自定義 object java11 Spring 引導 2.1<div id="text_translate"><p> 我有 ArrayList 對象列表,其中對象可以是文本、BigDecimal、Long</p><pre> List&lt;Object&gt; data = { {"date","prize1","cardsNumers","cardObtained","totalCards","anotherPrize"}, {"2020-05-01",435345.67,43,56,67,345345345}, {"2020-03-01",45656.2,34,67,23,456456}, {"2020-02-01",56565,34,56,67,878987} }</pre><p> arrayList 中的第 1、2、3 等對象是第 0 個 arraylist 中提到的每個字段的值。 在如下表中,</p><p> <a href="https://i.stack.imgur.com/Tmdw2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Tmdw2.png" alt="在此處輸入圖像描述"></a></p><p> 我想從上面獲取每個文件的總和並分配給下面自定義 Object 的同一字段,</p><pre> public class SumObject { private Date date; private BigDecimal sumPrize1; private BigDecimal sumCardsNumers; private long sumCardObtained; private long sumTotalCards; private long sumAnotherPrize; }</pre><p> 我通過遍歷 List 中的 arrayList 來實現這一點,並通過 get(index) 方法獲取值。 但我想知道是否有任何其他好的方法可以做到這一點。</p><p> 如果有人有任何建議,請發布答案或給我一個我可以閱讀的文件的方向。</p><p> 提前致謝。</p></div></object>

[英]what would be best way to convert List of ArrayList<Object> to a custom object java11 Spring boot 2.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 遷移到Java11 Google Cloud Dataflow 使用什么 java 運行時? java8 或 java11 與Java11兼容的JBoss版本 在Java11模塊中使用@PostConstruct或@PreDestroy 將 Mockito 與 Java11 一起使用時的異常 Eclipse GWT SDK 2.8.2 與 Java11 具有Java11的Openliberty有警告 Java11中的謂詞過濾所有元素 轉換 ArrayList 列表的最佳方法是什么<object>到自定義 object java11 Spring 引導 2.1<div id="text_translate"><p> 我有 ArrayList 對象列表,其中對象可以是文本、BigDecimal、Long</p><pre> List&lt;Object&gt; data = { {"date","prize1","cardsNumers","cardObtained","totalCards","anotherPrize"}, {"2020-05-01",435345.67,43,56,67,345345345}, {"2020-03-01",45656.2,34,67,23,456456}, {"2020-02-01",56565,34,56,67,878987} }</pre><p> arrayList 中的第 1、2、3 等對象是第 0 個 arraylist 中提到的每個字段的值。 在如下表中,</p><p> <a href="https://i.stack.imgur.com/Tmdw2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Tmdw2.png" alt="在此處輸入圖像描述"></a></p><p> 我想從上面獲取每個文件的總和並分配給下面自定義 Object 的同一字段,</p><pre> public class SumObject { private Date date; private BigDecimal sumPrize1; private BigDecimal sumCardsNumers; private long sumCardObtained; private long sumTotalCards; private long sumAnotherPrize; }</pre><p> 我通過遍歷 List 中的 arrayList 來實現這一點,並通過 get(index) 方法獲取值。 但我想知道是否有任何其他好的方法可以做到這一點。</p><p> 如果有人有任何建議,請發布答案或給我一個我可以閱讀的文件的方向。</p><p> 提前致謝。</p></div></object> Java:MalformedByteSequenceException(XML)
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM