gpt4 book ai didi

java - xml 1.1 在 xsd 中使用时导致 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 12:48:56 26 4
gpt4 key购买 nike

我有一个 xsd 文件。我正在尝试创建 javax.xml.validation.Schema使用该 xsd 文件。我已经编写了一个程序来执行此操作。当我使用<?xml version="1.0" encoding="UTF-8"?>时一切都很好。但是当我使用<?xml version="1.1" encoding="UTF-8"?>时然后第一次尝试创建 Schema正在抛出 NPE,但第二次及后续尝试均成功。以下为来源:

import java.io.File;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

public class Test {
SchemaFactory sf = null;

public static void main(String args[]) {

Test test = new Test();
test.init();
File schemaFile = new File("D:\\test.xsd");

try {
test.doIt(schemaFile);
} catch (Exception e) {
System.out.println("doIt() failed " + e.getMessage());
}
try {
test.doItAgain(schemaFile);
} catch (Exception e) {
System.out.println("doItAgain() failed " + e.getMessage());
}

System.out.println("Execution completed");

}

public void doIt(File schemaFile) throws Exception {
@SuppressWarnings("unused")
Schema schema = null;
synchronized (sf) {
schema = sf.newSchema(schemaFile);
}
System.out.println("doIt() success");
}

public void doItAgain(File schemaFile) throws Exception {
@SuppressWarnings("unused")
Schema schema = null;

synchronized (sf) {
schema = sf.newSchema(schemaFile);
}
System.out.println("doAgainIt() success");
}

public void init() {
sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
}
}

首先执行的方法( doIt()doItAgain() )抛出 NPE。

下面是堆栈跟踪:

java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1738)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1770)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(XMLEntityScanner.java:1543)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(XMLDocumentScannerImpl.java:1400)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:435)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:491)
at com.sun.org.apache.xerces.internal.impl.xs.opti.SchemaDOMParser.parse(SchemaDOMParser.java:510)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1802)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:594)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:610)
at Test.doIt(Test.java:39)
at Test.main(Test.java:20)

我的问题是,为什么 XML 1.1 不能正常工作?为什么只有第一次尝试就失败了?

最佳答案

我发现如果我使用最新版本的 Xerces jar,我就不会遇到这个问题。我还发现问题是因为JDK本身有一个bug,并且它也记录在 openjdk website更有趣的是,没有人愿意解决这个问题。因此,使用最新版本的 Xerces jar 或使用 xml 版本 1.0。我会选择第一个选项。谁知道旧的会有多少隐藏的惊喜:P

关于java - xml 1.1 在 xsd 中使用时导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com