如何修复java.lang.StringIndexOutOfBoundsException:length = 225; regionStart = 4; regionLength = -2

时间:2018-11-17 07:47:18

标签: java android android-studio substring

这是我的错误:

`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);`

2 个答案:

答案 0 :(得分:0)

jpg中似乎没有desc,因此desc.indexOf("jpg")返回-1,而+3给出了-2

答案 1 :(得分:0)

这就是我要怎么做。

  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>

类在

中生成

folder where you find generated sources

  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) {
....
}