简体   繁体   English

Android-java.lang.ArrayIndexOutOfBoundsException

[英]Android - java.lang.ArrayIndexOutOfBoundsException

I'm new to Java, but I have done some PSP coding in C before. 我是Java的新手,但是之前我已经用C做过一些PSP编码。 This seems to be quite different. 这似乎是完全不同的。

Below is the stack trace for what I'm seeing: 下面是我所看到的堆栈跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
enter code hereenter code here`at android.os.AsyncTask$3.done(AsyncTask.java:299)
enter code here`at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at com.adev.abmp3.ViewSongDialog$FindLyrics.doInBackground(ViewSongDialog.java:173)
at com.adev.abmp3.ViewSongDialog$FindLyrics.doInBackground(ViewSongDialog.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

And here is the patch of code: 这是代码补丁:

@Override
protected Void doInBackground(Void... arg0) {
    String searchQuery = title.replaceAll("[^ \\w]", "");
    searchQuery = searchQuery.replace(" ", "+");
    String searchResult = httpRun("http://search.azlyrics.com/search.php?q="+searchQuery).toString();
    System.out.println("http://search.azlyrics.com/search.php?q="+searchQuery);
    if(!searchResult.contains("Sorry, no results") && !searchResult.equals("")) {
        String link = searchResult.split("<table width=100%>")[1];
        link = link.substring(link.indexOf("<a href=\""), link.indexOf("\" rel"));
        link = link.replace("<a href=\"", "");

        String lR = httpRun(link).toString();
        if(lR != "" && lR.contains("<!-- start of lyrics -->")) {
            lR = lR.substring(lR.indexOf("<!-- start of lyrics -->"), lR.indexOf("<!-- end of lyrics -->"));
            lR = lR.replace("<!-- start of lyrics -->", "");
            lyrics = lR;
        } else {
            fail = 1;
            lyrics = "Couldn't find lyrics";
        }
    } else {
        fail = 1;
        lyrics = "Couldn't find lyrics";
    }
    return null;
}

I've done some research, and have read that you can't print to the screen within doInBackground - but I'm not sure where to go from here. 我已经进行了一些研究,并了解到您无法在doInBackground打印到屏幕上-但我不确定从何处去。 Any help would be appreciated. 任何帮助,将不胜感激。

EDIT: java.lang.StringIndexOutOfBoundsException in java.lang.String.startEndAndLength 编辑:java.lang.String.startEndAndLength中的java.lang.StringIndexOutOfBoundsException

Heres the new stack: 这是新堆栈:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.StringIndexOutOfBoundsException: length=7338; regionStart=537; regionLength=-538
at java.lang.String.startEndAndLength(String.java:593)
at java.lang.String.substring(String.java:1474)
at com.adev.abmp3.ViewSongDialog$FindLyrics.doInBackground(ViewSongDialog.java:174)
at com.adev.abmp3.ViewSongDialog$FindLyrics.doInBackground(ViewSongDialog.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

Your split call is returning an array of size 1, but you're trying to get the 2nd item in it (with the [1]). 您的拆分调用返回的是大小为1的数组,但是您试图在其中获取第二项(使用[1])。 You have to account for the possibility that your split string isn't in the input. 您必须考虑拆分字符串不在输入中的可能性。

String link = searchResult.split("<table width=100%>")[1];

The error is occuring there. 在那里发生错误。 Indices start at 0, and your split is returning an array of size 1, so element 1 is out of bounds, and hence the exception is thrown. 索引从0开始,并且您的拆分返回一个大小为1的数组,因此元素1超出范围,因此引发了异常。 If you change it to String link = searchResult.split("<table width=100%>")[0]; 如果将其更改为String link = searchResult.split("<table width=100%>")[0]; the exception will no longer be thrown. 异常将不再被抛出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM