【问题标题】:StringIndexOutOfBoundsException using SAXParser, InputStream, XMLHandler使用 SAXParser、InputStream、XMLHandler 的 StringIndexOutOfBoundsException
【发布时间】:2013-09-21 23:05:53
【问题描述】:

我正在尝试将 xml 转换为 wbxml,以将信息从假设备(iPhone、Android、Blackberry 等)传递到知道我正在发送的请求的服务器。我在这行代码上收到了 StringIndexOutOfBoundsException:

xr.parse(new InputSource(in));

我还将此代码添加到我的项目中以尝试进行转换: http://code.google.com/p/k9mail/source/browse/k9mail/branches/activesync/src/com/android/email/mail/internet/WBXML.java?r=403

您可以看到 cmets 注意到需要将 xml 流作为参数传入。我在下面的代码中这样做。

" /** * 将 XML 输入流转换为 WBXML 输出流 * * @param 在要读取的 XML 流中 * @param out 要写入的 WBXML 流 */ "

我对“CodePage”知之甚少,这可能是我在初始化“CodePage”数组时通过输入“1”来使用它的问题。我不知道该放什么。我确实知道,如果我取出数字“1”,那么 Eclipse 会抱怨我需要提供维度表达式或初始化数组。所以,也许这就是 stringindexoutofboundsexception 的来源,但直到后来才出现。无论如何,我也尝试了 1000 来初始化 CodePage 数组,但也没有帮助。

CodePage[] codePage = new CodePage[ 1000 ];

我也知道这可能是一个更复杂的问题,我不能在这里发布我的整个项目。我感谢任何提供帮助的高级人员。即使只是在一般意义上帮助确定这一点,也非常感谢。

====================== 这是该问题的链接中的相关代码===========

文件 1:

    File file19 = new File("data\\test.xml");
    InputStream is19 = new FileInputStream(file19);
    CodePage[] codePage = new CodePage[ 1 ];  // also tried 1000 here and made no difference, didn't help
    WBXMLClass wbxmlObject = new WBXMLClass( codePage );
    ByteArrayOutputStream byteArrayOutputStream19 = new ByteArrayOutputStream( );
    wbxmlObject.convertXmlToWbxml(is19, byteArrayOutputStream19 );

文件 2

 public void convertXmlToWbxml(InputStream in, OutputStream out) {

    SAXParserFactory spf = SAXParserFactory.newInstance();
    try {
        SAXParser sp = spf.newSAXParser();

        XMLReader xr = sp.getXMLReader();

        XMLHandler handler = new XMLHandler(out);

        xr.setContentHandler(handler);

        xr.parse(new InputSource(in));  // this is causing string index out of bounds ****************************
    } catch (ParserConfigurationException pce) {
        //Log.e("WBXML", "ParserConfigurationException in convertXmlToWbxml: " + pce);
    } catch (SAXException se) {
        //Log.e("WBXML", "SAXException in convertXmlToWbxml: " + se);
    } catch (IOException ioe) {
        //Log.e("WBXML", "IOException in convertXmlToWbxml: " + ioe);
    }
}

======================================

这是 Eclipse 中的错误:

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:-1 在 java.lang.String.substring(未知来源) 在 tags.WBXMLClass$XMLHandler.startElement(WBXMLClass.java:447) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知来源) 在 tags.WBXMLClass.convertXmlToWbxml(WBXMLClass.java:370) 在 Test.main(Test.java:452)

【问题讨论】:

  • 你能发布堆栈跟踪吗?
  • Test [Java Application] Test at localhost:28099 Thread [main] (Suspended (exception StringIndexOutOfBoundsException)) XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSource) 行:不可用 SAXParserImpl$JAXPSAXParser(XMLParser).parse (XMLInputSource) 行:不可用 SAXParserImpl$JAXPSAXParser(AbstractSAXParser).parse(InputSource) 行:不可用 SAXParserImpl$JAXPSAXParser.parse(InputSource) 行:不可用 WBXMLClass.convertXmlToWbxml(InputStream, OutputStream) 行:371 Test.main(String []) 行:459

标签: java android xml eclipse wbxml


【解决方案1】:

我对“代码页”了解不多

这与代码页无关。这是关于数组和数组维度的。但你的例外并不依赖于此。

更新1 好的,我认为问题就在这里:

WBXML.java 中的 447 行

namespaceURI = qName.substring(0, qName.lastIndexOf(":"));

qName.lastIndexOf(":") 可能返回 -1,表示 qName 中没有“:”符号。

【讨论】:

  • 如果我使用 System.out.println() 将其打印出来,我会得到:is19 = java.io.FileInputStream@799ec4b6。但是,如果我添加这个: InputStream is19 = new FileInputStream(file19); InputStreamReader isr19 = new InputStreamReader(is19); StringBuilder sb=new StringBuilder(); BufferedReader br = new BufferedReader(isr19);字符串读取 = br.readLine();而(读取!= null){ sb.append(读取);读取 =br.readLine(); } System.out.println("sb = " + sb);然后,我可以看到xml。看起来不错。标签之间有空格。但是,我认为这在 xml 中并不重要。
  • 您应该打印内容,而不是变量引用。检查这个:codereview.stackexchange.com/questions/8835/…
  • 向我们展示看起来不错的 XML。
  • 我刚看到那个帖子,这里是xml:1
  • 您的答案是 100% 正确的。我进一步调试并到达那条线并且出现错误。此时 qName = "someCommand" 和 localName = ""。没有“:”。因此,namespaceURI 不能分配 qName 的子字符串,因为长度未知,因为没有“:”来标记子字符串的结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2013-03-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多