Исключение индекса массива Java вне границ: -1

Хорошо, у меня есть проблема, я не могу понять, что не так. Итак, у меня есть jList и List . Мне нужна функция, которая, когда я нажимаю на элемент (в jList любой элемент), и он изменится в моем значке ярлыка (я имею дело с изображениями). Это как-то работает, он меняет значок моей метки на изображение, которое я выбираю из jList, но выдает мне исключение, и программа вылетает, обычно первые 2 элемента не вызывают ошибок, третий и последующие элементы вызывают это. После того, как он вылетает и выдает мне кучу красного текста, я все еще могу изменить свою иконку.

Это функция, в которой я получаю изображения и добавляю их в список (добавляя к ним путь)

private static void getImages(String src) throws IOException {
    //Exctract the name of the image from the src attribute
    int indexname = src.lastIndexOf("/");

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

    indexname = src.lastIndexOf("/");
    String name = src.substring(indexname, src.length());

    //Open a URL Stream
    URL url = new URL(src);
    InputStream in = url.openStream();

    GPath=fPath+name;
    OutputStream out = new BufferedOutputStream(new FileOutputStream( GPath));
    //Im adding to the list string (link to image) here
    imagesListN.add(GPath);

    System.out.println("list size: "+imagesListN.size());


    for (int b; (b = in.read()) != -1;) {

        out.write(b);
    }

    out.close();
    in.close();

}

Добавляет их нормально. Да, я их скачиваю, поэтому я хочу увидеть их, как только они будут загружены.

Здесь я нажимаю на функцию jList.

     list.addListSelectionListener(new ListSelectionListener() {

        private int a;

        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            if (!arg0.getValueIsAdjusting()) {
                String h;
                int k;
                k = list.getSelectedIndex();
                System.out.println("List id: "+k);
                a = Main.imagesListN.indexOf(k);
                System.out.println("imagesListN id: "+a);

                h = Main.imagesListN.get(k);
                System.out.println("h : "+h);
                ImageIcon img = new ImageIcon(h);

                imageReview.setIcon(img);
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    });

Вот jList (список имен). Исключение в

a = Main.imagesListN.indexOf(k);

это дает мне -1 , но h = Main.imagesListN.get(k); дает мне нужную ссылку и передает ее ImageIcon img = new ImageIcon(h);, а затем imageReview.setIcon(img); . Значок ярлыка меняется каждый раз, когда я нажимаю на нужный мне элемент. Может быть, я смотрю не на a = Main.imagesListN.indexOf(k); , а что-то дает мне -1. Кстати, я выполняю все в Thread.

`public class Crawler extends Thread {

Main main = new Main();

public void run(){
        try {
                main.download();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}`

ничего особенного здесь. Каждая функция находится в своем собственном классе, getImages() находится в основном, listListener находится в классе Langas (класс, в котором все кнопки, метки и т. д. больше ничего не создают) и Thread well, Thread. Также он отлично работает после того, как все загружено, без исключений. Во время загрузки появляется ошибка


person Gaxt    schedule 11.03.2015    source источник
comment
Опубликуйте достаточно кода, чтобы мы могли воспроизвести.   -  person Jean-François Savard    schedule 11.03.2015
comment
Пожалуйста, посмотрите на этот фрагмент кода и отредактируйте свой... public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (list.getSelectedIndex() == -1) { //No selection, disable fire button. fireButton.setEnabled(false); } else { //Selection, enable the fire button. fireButton.setEnabled(true); } } }   -  person ibrahim demir    schedule 11.03.2015
comment
Даже если я закомментирую a = Main.imagesListN.indexOf(k); Он все еще показывает ту же ошибку   -  person Gaxt    schedule 11.03.2015


Ответы (1)


indexOf API принимает Object в качестве параметра, а get принимает Object, а также примитивные типы. Поэтому, когда вы вызываете get с элементом примитивного типа, он ищет элемент по индексу, который вы, возможно, нашли.

Но когда вы делаете indexOf, вы ищете объект в своем списке и, следовательно, получаете -1.

person SMA    schedule 11.03.2015