Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原因:java.lang.ArrayIndexOutofBoundsException:索引=1_Java_Android_Android Studio - Fatal编程技术网

原因:java.lang.ArrayIndexOutofBoundsException:索引=1

原因:java.lang.ArrayIndexOutofBoundsException:索引=1,java,android,android-studio,Java,Android,Android Studio,我一直在用这个应用程序从一个网页上下载所有的图片,现在已经有一天了,在谷歌搜索了大约5个小时后,没有找到任何答案。我一直在标题中得到错误消息以及以下logcat错误 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurren

我一直在用这个应用程序从一个网页上下载所有的图片,现在已经有一天了,在谷歌搜索了大约5个小时后,没有找到任何答案。我一直在标题中得到错误消息以及以下logcat错误

java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:864)
 Caused by: java.lang.ArrayIndexOutOfBoundsException: index=1
        at java.util.regex.Matcher.appendEvaluated(Matcher.java:149)
        at java.util.regex.Matcher.appendReplacement(Matcher.java:111)
        at java.util.regex.Matcher.replaceAll(Matcher.java:321)
        at java.lang.String.replaceAll(String.java:1785)
        at com.luke.test.Download$Main.getImages(Download.java:117)
        at com.luke.test.Download$Main.doInBackground(Download.java:91)
        at com.luke.test.Download$Main.doInBackground(Download.java:74)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
除了我提供的错误,我还有我的代码

public class Download extends Activity {
    ProgressDialog mProgressDialog;
    EditText editText;
    Button button;
    String data;
    private String URL1;
    private ImageView downloadedImg;
    private ProgressDialog simpleWaitDialog;
    String stored = null;
    private String folderPath = android.os.Build.MODEL + "\\Internal storage\\Pictures\\Screenshots\\";
    private static final String name = ".jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);
        editText = (EditText) findViewById(R.id.editText1);
        button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                data = editText.getText().toString();
                URL1 = data;
                Log.v("URL", URL1);
                new Main().execute();
            }
        });
    }

    private class Main extends AsyncTask<Void, Void, Void> {
        public Void doInBackground(Void... params) {

            try {


                Document doc = Jsoup.connect(URL1).get();

                Elements img = doc.getElementsByTag("img");

                for (Element el : img) {


                    String src = el.absUrl("src");
                    System.out.println("Image Found!");
                    System.out.println("src attribute is : " + src);

                    getImages(src, folderPath, name);

                }

            } catch (IOException ex) {
                System.err.println("There was an error");
                Logger.getLogger(Download.class.getName()).log(Level.SEVERE, null, ex);
            }

            return null;
        }

        private void getImages(String src, String folderPath, String name) throws IOException {

            int indexname = src.lastIndexOf("/");

            if (indexname == src.length()) {
                src = src.substring(1, indexname);
            }

            indexname = src.lastIndexOf("/");
            String srcname = src.substring(indexname, src.length());
            String Path = folderPath;

            String myString = Path + srcname + name;
            myString = myString.replace("?", "");
            myString = myString.replaceAll("/", "\\");
            System.out.println(myString);

            URL url = new URL(src);
            InputStream in = new BufferedInputStream(url.openStream());
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int n = 0;
            while (-1!=(n=in.read(buf)))
            {
                out.write(buf, 0, n);
            }
            out.close();
            in.close();
            byte[] response = out.toByteArray();
            FileOutputStream fos = new FileOutputStream(myString);
            fos.write(response);
            fos.close();
        }

        protected void OnPostExecute(Void result) {
            mProgressDialog.dismiss();
        }
    }
}

我知道,它非常笨重,而且填充了我目前没有使用的字符串,这可能是我的问题的一部分。因此,综上所述,如果能帮助我们找出这个错误,我们将不胜感激

stacktrace告诉您问题出在这一行:

myString = myString.replaceAll("/", "\\");
这两个字符串用作正则表达式。这与此相同,但没有正则表达式:

myString = myString.replace("/", "\\");

我用一个非常简单的应用程序重新创建了您的异常:

public class Test {

     public static void main(String []args){
        String myString = "a/b";
        myString = myString.replaceAll("/", "\\");
        System.out.println(myString);
     }
}
该守则规定:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    at java.lang.String.charAt(String.java:658)
    at java.util.regex.Matcher.appendReplacement(Matcher.java:762)
    at java.util.regex.Matcher.replaceAll(Matcher.java:906)
    at java.lang.String.replaceAll(String.java:2162)
    at Test.main(Test.java:5)
用replace替换replaceAll解决了这个问题

另一个可行的选择是 myString=myString.replaceAll/,Matcher.quoteReplacement\\


这将取消替换字符串中\的特殊含义。

其他两个答案将引导您朝着正确的方向前进。这段代码:

int indexname = src.lastIndexOf("/");

if (indexname == src.length()) {
    src = src.substring(1, indexname);
}

看起来不对。indexname永远不会等于src.length。lastIndexOf永远不能返回等于搜索字符串长度的值。在不匹配的情况下,它将始终是一个介于[0,length-1]或-1之间的值。

那么第117行是什么呢?你能确认这些图片是否存在吗?好吧,我已经成功地在PC上使用创建了应用程序,这是我一直在使用的测试站点,我每次都从google获得相同的两张图片,所以我非常确定这些图片存在。至于117行,没有,我认为117行没有任何内容。