java.lang.arrayindexoutofboundsexception jsoup - PullRequest
0 голосов
/ 31 января 2019

я пытаюсь извлечь все изображения с веб-сайта и проанализировать каждое из них с помощью API распознавания изображений aws, это работает для некоторых веб-сайтов, однако некоторые веб-сайты возвращают сообщение об ошибке, в котором говорится: 500 server error java.lang.arrayindexoutofboundsexception index:281 size 281

, но я просто удаляю изображения с помощью jsoup изатем создаю объект для хранения имени и URL-адреса изображения для каждого изображения, после чего я вызываю API и проверяю каждое изображение в arraylist.по какой-то причине это работает только для некоторых веб-сайтов.

Может кто-нибудь объяснить, что я делаю не так и как предотвратить эту ошибку?

@WebServlet(name = "HelloAppEngine", urlPatterns = {
    "/hello"
})
public class HelloAppEngine extends HttpServlet {

    static ArrayList < ResponseData > testImages = new ArrayList < > ();
    static AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.defaultClient();

    public static void getimages() throws MalformedURLException, IOException {

        System.out.println("getImages called" + testImages);
        int index = 0;
        for (ResponseData data: testImages) {

            System.err.println("open stream for:" + data.getUrl());
            ByteBuffer imageBytes = null;
            try (InputStream inputStream = new URL(data.getUrl()).openStream()) {
                System.out.println(inputStream);
                imageBytes = ByteBuffer.wrap(IOUtils.toByteArray(inputStream));

                System.out.println(imageBytes);

            } catch (IOException e1) {
                System.err.println(e1.getMessage());
            }


            //
            DetectLabelsRequest request = new DetectLabelsRequest().withImage(new Image().withBytes(imageBytes)); //.withMaxLabels(10).withMinConfidence(77F);


            try {

                DetectLabelsResult result = rekognitionClient.detectLabels(request);
                List < Label > labels = result.getLabels();
                //System.out.println(labels);
                //System.out.println("Detected labels for " + photo+""+labels);
                for (Label label: labels) {
                    //loop through all labels of object 
                    //create new responsedata object for each image
                       //where im getting error  
                     if (testImages.get(index) != null) {
                    ResponseData d = testImages.get(index);
                    d.setName(label.getName());
                    testImages.set(index, d);
                    //increment for making new image url and name
                    index++;


                    System.out.println(label.getName() + ": " + label.getConfidence().toString());
                }
                }
                //
            } catch (AmazonRekognitionException e) {
                System.err.println(e.getMessage());
            }

        }
    }

    private static final long serialVersionUID = 1 L;

    protected static final Gson GSON = new GsonBuilder().create();

    // This is just a test array

    ArrayList < String > list = new ArrayList < String > ();

    @Override

    protected final void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/json");
        String servlet = req.getServletPath();
        System.setProperty("http.proxyHost", "192.168.5.1");
        System.setProperty("http.proxyPort", "1080");
        log("servlet:" + servlet);
        if (servlet.equalsIgnoreCase("/main")) {
            log("if body start");

            String urlString = java.net.URLDecoder.decode(req.getParameter("url"), "UTF-8");

            // Connect to website. This can be replaced with your file loading
            // implementation
            Document doc = Jsoup.connect(urlString).get();

            // Get all img tags
            Elements img = doc.getElementsByTag("img");
            Elements media = doc.select("[src]");
            int counter = 0;

            // Loop through img tags
            for (Element src: media) {
                if (src.tagName().equals("img")) {
                    counter++;
                       //create reposnsedata object for each image url
                    ResponseData data = new ResponseData();
                      //set object url to image url
                    data.setUrl(src.attr("abs:src"));
                     //set data name from aws 
                    data.setName(" ");
                    testImages.add(data);
                    // getimages();
                }
                if (src.tagName().equals("link[href~=.*\\.(ico|png)]")) {
                    System.out.println("image is logo");
                }
                if (src.tagName().equals("meta[itemprop=image]")) {
                    System.out.println("image is logosss");
                }

            }
        }
        //log("list" + testImages);
        getimages();
        //

        // getimages();
        System.err.println(GSON.toJson(testImages));
        resp.getWriter().println(GSON.toJson(testImages));
    }

    @Override
    protected final void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

}

1 Ответ

0 голосов
/ 31 января 2019

Вы пытаетесь получить 282-е изображение (индекс = 281) из testImages, но есть только 281 (индекс = 280).Вы получаете каждое изображение для каждого ярлыка, и возможно, что ярлыков больше, чем изображений.Попробуйте отобразить количество их обоих:

System.out.println("testImages.size() is: " + testImages.size());
System.out.println("labels.size() is: " + labels.size());

Чтобы избежать получения большего количества изображений, чем надписей, попробуйте заменить это условие:

if (testImages.get(index) != null) {

на

if (index < testImages.size() && testImages.get(index) != null) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...