0

Java は初めてですが、以前に C で PSP コーディングを行ったことがあります。これはかなり違うようです。

以下は、私が見ているもののスタック トレースです。

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)

そして、ここにコードのパッチがあります:

@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;
}

私はいくつかの調査を行い、画面に印刷できないことを読みましたdoInBackgroundが、ここからどこに行くべきかわかりません. どんな助けでも大歓迎です。

編集: java.lang.String.startEndAndLength の java.lang.StringIndexOutOfBoundsException

新しいスタックは次のとおりです。

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)
4

2 に答える 2

3

分割呼び出しはサイズ 1 の配列を返していますが、その中の 2 番目の項目を取得しようとしています ([1] を使用)。分割文字列が入力にない可能性を考慮する必要があります。

于 2013-02-26T20:56:40.977 に答える
0
String link = searchResult.split("<table width=100%>")[1];

そこでエラーが発生しています。インデックスは 0 から始まり、分割はサイズ 1 の配列を返すため、要素 1 は範囲外であるため、例外がスローされます。に変更するとString link = searchResult.split("<table width=100%>")[0];、例外はスローされなくなります。

于 2013-02-26T21:12:43.067 に答える