org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.
我的研究表明,这条消息通常表明(没有特别的顺序)
>公然无效的数据(例如,尝试读取ZIP文件,就像它是XML文件一样);
> byte order marks的存在;
>在UTF-8中存在不合法的字符;要么
>声称是UTF-8编码的文件.
这些都不适用于我正在处理的文件.我在程序执行期间检查了字节数组形式的输入,它不包含BOM或任何非ASCII字符.
处理通过我的30kb文档的大约五分之一,然后崩溃在一个不起眼的英语句子上(“不起眼”,我的意思是所有字节都在32(空格)和122(小写z)之间;换句话说,标准键盘字符).假定有问题的元素的字节在这篇文章的末尾.
奇怪的是,失败的文档是通过从较大的文档中删除一些元素来生成的,这些元素被相同的代码干净地处理.
我知道异常是在实现org.xml.saxXMLReader接口的对象的parse(InputSource input)方法中抛出的.根据the Javadoc,SAXException表示
Any SAX exception,possibly wrapping another exception.
检查调试器中的异常表明没有包装异常.
可能导致此错误的原因是什么?
编辑:
[60,80,97,114,103,112,104,62,69,120,101,99,117,116,105,118,32,83,109,121,58,70,111,49,55,53,52,54,51,13,10,110,100,65,115,119,102,108,98,44,75,71,73,76,88,86,46,107,89,39,87,59,78,60,47,62]
在第三次出现109之后抛出异常.
解决方法
我不完全确定这是如何或为什么解决这个问题,因为抛出异常的地点附近的字节 – 问题末尾的字节 – 本身都是有效的UTF-8字节,但看起来确实如此有固定的东西.
我可以想到的唯一可能的原因是我错过了文件中较早的无效字节,这使得事情搞砸了但并没有导致立即崩溃.我正在从ByteArrayInputStream中读取字节,因此程序可能会同时从缓冲区中读取一个大块,这会将pos标记设置为超出假设的坏字符所在位置的位置.