Java ArrayList 索引越界异常

标签 java arraylist

我正在尝试用 Java 读取某个文件,每当我从脚本中读取一行代码时,它都会显示:

Welcome to DrJava.  Working directory is /Users/anu-lion
> run WebCrawler02
!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ena
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:635)
    at java.util.ArrayList.get(ArrayList.java:411)
    at WebCrawler02.main(WebCrawler02.java:147)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
> 

我知道这个错误是由于编码无法到达特定索引而引起的,但我目前不知道如何修复它。

这是我的编码。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class WebCrawler02 {
            ArrayList<String> pagesVisited;
            ArrayList<String> pagesToVisit;

            public static URL getStartingURLFromUser() {
                        // This method gets the URL from user.
                        // Initializes the URL string.
                        URL startingURL = null;
//                     String startingString = "http://www.cs.uwec.edu/~stevende/cs145testpages/default.htm";
                         String startingString = JOptionPane.showInputDialog(null, "Enter a valid URL:");
                        startingString.toLowerCase();
                        // catches errors in URL.
                        try {
                                    startingURL = new URL(startingString);
                        } catch (MalformedURLException e) {
                                    System.out.println("Bad URL");
                                    System.exit(0);
                        }
                        return startingURL;
            }

            public static String htmlReader(URL webURL) {
                        // Initializes the strings.
                        String htmlContent = null;
                        // Reading the file.
                        // This try/catch block reads in a file with a reader and creates a
                        // continuous string.
                        try {
                                    URLConnection con = webURL.openConnection();
                                    InputStream is = con.getInputStream();
                                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                                    String line = br.readLine();
                                    while (line != null) {
                                                htmlContent = htmlContent + line + " ";
                                                line = br.readLine();
                                    }
                                    br.close();
                        } catch (MalformedURLException e) {
                                    System.out.println("Bad URL");
                                    System.exit(0);
                        } catch (FileNotFoundException e) {
                                    e.printStackTrace();
                                    System.out.println("File not found.");
                        } catch (IOException e) {
                                    e.printStackTrace();
                                    System.out.println("after try/catch");
                        }
                        return htmlContent;
            }

            public static ArrayList<String> linkParser(String htmlContents) {
                        // Initializes the strings, boolean, variables and arraylist.
                        ArrayList<String> listOfLinks = new ArrayList<String>();
                        int i = 0;
                        int k = 0;
                        boolean search = true;
                        String URL = "";
                        // This loop creates an array list of URL's.
                        while (search == true) {
                                    i = htmlContents.indexOf("HREF=", k) + 6;
                                    k = htmlContents.indexOf("\">", i);
                                    URL = htmlContents.substring(i, k);
                                    listOfLinks.add(URL);
                                    if (i == htmlContents.lastIndexOf("HREF=") + 6) {
                                                search = false;
                                    }
                        }
                        return listOfLinks;
                        // System.out.println(htmlContents);
            }
            public static boolean isBrokenLink(URL currentURL, String theHREF) {
                        // Initializes the strings, boolean, variables and arraylist.
                        Boolean isbroken = false;
                        try {
                                    URL baseURL = new URL(currentURL, theHREF);
                                    URLConnection con = currentURL.openConnection();
                                    HttpURLConnection httpProtocol = (HttpURLConnection) con;
                                    httpProtocol.getResponseCode();
                                    int httpPro = httpProtocol.getResponseCode();
                                    if (httpPro != 200) {
                                                isbroken = true;
                                    }
                        } catch (MalformedURLException e) {
                                    isbroken = true;
                                    System.out.println("Bad URL1");
                        } catch (FileNotFoundException e) {
                                    isbroken = true;
                                    e.printStackTrace();
                                    System.out.println("File not found.");
                        } catch (IOException e) {
                                    isbroken = true;
                                    e.printStackTrace();
                                    System.out.println("after try/catch");
                        }
                        return isbroken;
            }

            public static void displayBrokenLinkReport(
                                    ArrayList<ArrayList<String>> brokenLinks) {
                        System.out.println("Broken Link Report: \n");
                        for (int j = 0; j < brokenLinks.size(); j++) {
                                    for (int i = 0; i < brokenLinks.get(j).size(); i++) {
                                                if (j == 0) {
                                                            System.out.println("Page " + brokenLinks.get(j).get(i));
                                                } else {
                                                            System.out.println("Broken link "
                                                                                    + brokenLinks.get(j).get(i));
                                                }
                                    }
                        }
            }

            public static void main(String[] args) {
                        // Initializes the arraylists and the array<arraylist
                        ArrayList<URL> pagesVisited = new ArrayList<URL>();
                        ArrayList<URL> pagesToVisit = new ArrayList<URL>();
                        ArrayList<String> listOfLinks = null;
                        ArrayList<String> badLinks = null;
                        ArrayList<ArrayList<String>> brokenLinks = new ArrayList<ArrayList<String>>();
                        int i = 0;
                        // calls the getStartingURLFromUser method which returns the string.
                        pagesToVisit.add(getStartingURLFromUser());
                        while (!pagesToVisit.isEmpty()) {
                                    URL baseURL = pagesToVisit.get(0);
                                    pagesVisited.add(baseURL);
                                    pagesToVisit.remove(0);
                                    // calls the htmlReader method which returns the string.
                                    String htmlContent = htmlReader(baseURL);
                                    // calls the linkParser method which returns the array list.
                                    listOfLinks = linkParser(htmlContent);
                                    // calls the isBrokenLink method which returns the string.
                                    for (i = 0; i <= (listOfLinks.size()); i++) {
                                                boolean isBL = isBrokenLink(baseURL, listOfLinks.get(i));
                                                System.out.println(listOfLinks.get(i) + "a");
                                                if (isBL) {
                                                            System.out.println(listOfLinks.get(i));
                                                            badLinks.add(listOfLinks.get(i));
                                                } else {
                                                            // catches errors in URL.
                                                            URL nextURL = null;
                                                            try {
                                                                        nextURL = new URL(baseURL, listOfLinks.get(i));
                                                                        if (!pagesVisited.contains(nextURL)) {
                                                                                    pagesToVisit.add(nextURL);
                                                                        }
                                                            } catch (MalformedURLException e) {
                                                                        e.printStackTrace();
                                                                        System.out.println("Bad URL2");
                                                            }
                                                }
                                    }
                                    brokenLinks.add(badLinks);
                        }
                        displayBrokenLinkReport(brokenLinks);
            }
}

提前致谢。

最佳答案

for (i = 0; i <= (listOfLinks.size()); i++) 我想问题就在这里,尝试使用普通 <而不是<=listOfLinks.size()应该是你的 listOfLinks 的大小,并且由于它的索引从零开始,因此最后一个元素的索引应为 listOfLinks.size()-1 .

关于Java ArrayList 索引越界异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416657/

相关文章:

java - 转换日期时出现异常

Java静态和动态绑定(bind)、重载

java - Selenium:根据可见文本获取属性值?

java - 与 ArrayList 字符串变量匹配的模式不起作用

java - 我写入文件的文本错误吗?

java - 我的 Java 类 addUserToTheList() 不起作用

java - ArrayList<Integer> 自动将其类型更改为 ArrayList <String>

java - SOAP 客户端对 JAVA 中给定 WSDL 的奇怪响应

java - 在 Java 中将 XML 或 HTML 转换为实体编号(而不是实体名称)

python - 如何使用 Python 展平这样的数组?