我正在使用Schematron来验证针对Probatron4j样式表的一些XML文件,byte order marks在内部使用Saxon。大多数情况下,这很好,但偶尔会因错误处理崩溃
org.xml.sax.SAXParseException:1字节UTF-8序列的字节1无效。
我的研究表明,此消息通常表示(无特定顺序)
这些都不适用于我正在处理的文件。我在程序执行期间以字节数组的形式检查了输入,它不包含BOM或任何非ASCII字符。
处理通过我的30kb文档大约五分之一,然后崩溃在一个不起眼的英语句子上(“不起眼”,我的意思是所有字节都在32(空格)和122(小写z)之间;换句话说,标准键盘字符)。假定有问题的元素的字节在这篇文章的末尾。
奇怪的是,失败的文档是通过从较大的文档中删除一些元素来生成的,这些元素被相同的代码干净地处理。
我知道在实现parse(InputSource input)
接口的对象的org.xml.saxXMLReader
方法中抛出异常。根据{{3}},SAXException
表示
任何SAX异常,可能包含另一个异常。
在调试器中检查异常表明没有包装异常。
可能导致此错误的原因是什么?
编辑:
[60, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62, 69, 120, 101, 99, 117, 116,
105, 118, 101, 32, 83, 117, 109, 109, 97, 114, 121, 58, 32, 70, 114, 111, 109,
32, 49, 55, 53, 52, 32, 116, 111, 32, 49, 55, 54, 51, 13, 10, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 69, 117, 114, 111, 112, 101, 32, 97, 110, 100,
32, 116, 104, 101, 32, 65, 109, 101, 114, 105, 99, 97, 115, 32, 119, 101, 114,
101, 32, 99, 97, 117, 103, 104, 116, 32, 117, 112, 32, 105, 110, 32, 97, 32, 99,
111, 110, 102, 108, 105, 99, 116, 32, 98, 101, 116, 119, 101, 101, 110, 32, 69,
110, 103, 108, 97, 110, 100, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110,
103, 32, 71, 101, 111, 114, 103, 101, 32, 73, 73, 44, 32, 97, 110, 100, 32, 70,
114, 97, 110, 99, 101, 44, 32, 117, 110, 100, 101, 114, 32, 75, 105, 110, 103,
32, 76, 111, 117, 105, 115, 32, 88, 86, 46, 32, 73, 110, 32, 69, 117, 114, 111,
112, 101, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 105,
115, 32, 112, 101, 114, 105, 111, 100, 32, 119, 97, 115, 32, 107, 110, 111, 119,
110, 32, 97, 115, 32, 116, 104, 101, 32, 83, 101, 118, 101, 110, 32, 89, 101,
97, 114, 115, 39, 32, 87, 97, 114, 59, 32, 105, 110, 32, 78, 111, 114, 116, 104,
32, 65, 109, 101, 114, 105, 99, 97, 32, 105, 116, 32, 99, 97, 109, 101, 32, 116,
111, 32, 98, 101, 32, 99, 97, 108, 108, 101, 100, 32, 116, 104, 101, 32, 70,
114, 101, 110, 99, 104, 32, 97, 110, 100, 32, 73, 110, 100, 105, 97, 110, 32,
87, 97, 114, 46, 32, 73, 116, 32, 119, 97, 115, 32, 97, 32, 99, 111, 110, 102,
108, 105, 99, 116, 32, 111, 118, 101, 114, 13, 10, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 116, 114, 97, 100, 101, 32, 97, 110, 100, 32, 108, 97, 110,
100, 46, 60, 47, 80, 97, 114, 97, 103, 114, 97, 112, 104, 62]
109
第三次出现后抛出异常。
答案 0 :(得分:3)
我已经解决了这个问题。尽管Java在其String
对象内部使用UTF-8,但String
类的getBytes()
方法将在系统的默认编码中产生字节,除非您明确指定您想要UTF-8(或它理解的一些其他编码方案。)
我不完全确定这是如何或为什么解决这个问题,因为抛出异常的地点附近的字节 - 问题末尾的字节 - 都是有效的UTF-8字节,但是它确实似乎有固定的东西。
我能想到的唯一可能的原因是我错过了文件中较早的无效字节,这使得事情搞砸了,但没有造成立即崩溃。我正在从ByteArrayInputStream
读取字节,因此程序可能会同时从缓冲区读取一个大块,这会将pos
标记设置为超出假设的坏字符所在的位置。位于。
答案 1 :(得分:0)
我在等待你的字节数组时做了一些谷歌搜索。
你说
奇怪的是,失败的文档是通过从较大的文档中删除一些元素来生成的,这些元素被相同的代码干净地处理。
From that, I suspect the problem in this thread is probably your problem