【问题标题】:how to fix java.lang.StringIndexOutOfBoundsException: length=225; regionStart=4; regionLength=-2如何修复 java.lang.StringIndexOutOfBoundsException: length=225;区域开始=4;区域长度=-2
【发布时间】:2019-04-20 07:36:17
【问题描述】:

这是我的错误:

`E/AndroidRuntime: 致命异常: AsyncTask #2 进程:com.example.yasht.recyclerviewrss,PID:4097 java.lang.RuntimeException:执行doInBackground()时出错

    at android.os.AsyncTask$3.done(AsyncTask.java:325)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)

    at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.StringIndexOutOfBoundsException: length=225; regionStart=4; regionLength=-2
    at java.lang.String.substring(String.java:1931)
    at com.example.yasht.recyclerviewrss.m_Rss.RssParser.parseRSS(RssParser.java:107)
    at com.example.yasht.recyclerviewrss.m_Rss.RssParser.doInBackground(RssParser.java:47)
    at com.example.yasht.recyclerviewrss.m_Rss.RssParser.doInBackground(RssParser.java:21)`      

我发生错误的来源:

case XmlPullParser.END_TAG:

                    if(!isSiteMeta)
                    {
                        if(tagName.equalsIgnoreCase("title"))
                        {
                            article.setTitle(tagValue);
                        }else if(tagName.equalsIgnoreCase("description"))
                        {
                            String desc=tagValue;

                            //EXTRACT IMAGE FROM DESC
                            // error in this line =>  
                             String 
 imageUrl=desc.substring(desc.indexOf("src=")+5,desc.indexOf("jpg")+3);
                            article.setImageurl(imageUrl);`

【问题讨论】:

  • 为什么不把xml解析成一个对象呢?如果你只是想这样做,那么在我做一个子字符串之前我会检查一些事情。 if (desc.indexOf("src=") > 0 && desc.indexOf("jpg") > desc indexOf("src") + 5)....等

标签: java android android-studio substring


【解决方案1】:

似乎jpg 不在desc 中,所以desc.indexOf("jpg") 返回-1+3 给出-2

【讨论】:

    【解决方案2】:

    我会这样做。

    1. 为 XML 创建一个 XSD 如果你使用 Intellij,你可以从 XML 创建 XSD

    2. 使用 JAXB 创建映射对象 您可以将 XSD 放入您的资源文件夹,并使用 JAXB maven 插件,它会在您构建 maven 项目时为您生成类。

    <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.12.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    

    类在

    中生成

    1. 将 XML 解析为对象。 只需将这些类从 xjc 复制到您的项目中,您需要做的就是:-
    JAXBContext jaxbContext = JAXBContext.newInstance(MessageType.class, ObjectFactory.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    Source source = new StreamSource(new StringReader(xml));
    JAXBElement<MessageType> root = unmarshaller.unmarshal(source, MessageType.class);
    

    这种方法比尝试自己解析 XML 文档要好得多。

    如果你必须手动操作

    如果你只是想按照你的方式做,那么我会在做一个子字符串之前检查一些事情。

    if (desc.indexOf("src=") > 0 && desc.indexOf("jpg") > desc indexOf("src") + 5) {
    ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2011-05-29
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多