Java11,应将MalformedByteSequenceException替换为什么?

ele*_*ect -2 java sun internals java-11

我正在将项目移至Java11

我已经改变了sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpljava.lang.reflect.ParameterizedType(作为指定在这里),现在之交MalformedByteSequenceException

警告:MalformedByteSequenceException是内部专有API,可以在以后的版本导入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) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

无论如何,我在网上找不到任何关于此的信息。

我能想到的最接近的是UnsupportedEncodingException,但我不确定。

另外,这可能是从网络复制的一些旧代码的遗留物,并且显然,如果我删除它,则对于编译器来说一切看起来仍然很好。

那么,关于Java11是否有任何一般/好的建议?

编辑:对于寻求关闭此问题的人,因为

寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为,特定的问题或错误以及在问题本身中再现该错误所需的最短代码。没有明确问题陈述的问题对其他读者没有用。请参阅:如何创建最小的,可复制的示例。

我会尝试更清楚地解释。

这里没有调试帮助,在Java11中,有些软件包不会导出给公共用户,例如sun.*,它们不应该正常使用(除非特殊条件)。代码在jdk8下工作正常,但在ojdk11下却抱怨,因此我可以使用一些解决方法使它们在运行时始终可见,或者使其正确并摆脱它们。后者是我想要做的。鉴于我在网上找不到任何东西,所以我在这里问。

Hol*_*ger 5

MalformedByteSequenceExceptionextended CharConversionException,extends IOException,该parse方法迫使您仍然无法捕获。因此,在捕获IOException或时CharConversionExceptionMalformedByteSequenceException如果直接抛出,也会捕获。

但是,JDK 11中的XML解析器似乎在行为上有所变化。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(new byte[] { 1, 2, 3, -5 }));
Run Code Online (Sandbox Code Playgroud)

我懂了

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(new byte[] { 1, 2, 3, -5 }));
Run Code Online (Sandbox Code Playgroud)

而不是

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
Run Code Online (Sandbox Code Playgroud)

以前的版本。

换句话说,parse现在抛出SAXParseException一个原因,并将其初始化为MalformedByteSequenceException。因此,要检测出问题是字节序列格式不正确,请分别。文字编码错误,则需要类似

catch(SAXException ex) {
    if(ex.getCause() instanceof CharConversionException) {
        System.out.println("maformed bytes or wrong encoding: "+ex.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

要处理较新和较旧的版本,您需要

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

分别

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());
}
Run Code Online (Sandbox Code Playgroud)