ArrayList выкидываетOfIndex при добавлении элемента - PullRequest
0 голосов
/ 16 июня 2020

добавление необработанного элемента, такого как ar1.add (0), нормально, не вызывает ошибку, но при попытке добавить ar1.add (s) выдает ошибку
** ошибка не находится в ar Ошибка массива находится в массиве ar1, который имеет экземпляр в методе **

, есть ли какое-либо обходное решение?
`

package graph;

import java.util.*;

public class PrintAllPathUsingDfs {
    static ArrayList<Integer> arr[];

    public static void main(String[] args) {
      Scanner s = new Scanner(System.in);
//      int V =s.nextInt();
//      int E =s.nextInt();
        arr = new ArrayList[4];
      //arrays cant be generic in java
      for(int i =0 ; i< 4;i++)
      {
          arr[i]=new ArrayList<Integer>();
      }
      arr[0].add(1); 
      arr[0].add(2); 
      arr[0].add(3); 
      arr[2].add(0); 
      arr[2].add(1); 
      arr[1].add(3); 
     int src = 2;
     int d =3;
      ArrayList<Integer> ar=new ArrayList<Integer>();
     printAllPaths(src, d,ar);
 }
    static void printpath(ArrayList<Integer> ar)
    {
        for(int i = 0; i<ar.size();i++)
        {
            System.out.print(ar.get(i)+" ");
        }
        System.out.println();
    }
    static  void printAllPaths(int s , int d,ArrayList<Integer> ar)
    {
       Iterator<Integer> it = arr[s].listIterator();
       ArrayList<Integer> ar1=new ArrayList<>();

//       for(int i=0;i<ar.size();i++)
//       {
//         ar1.add(ar.get(i));
//       }
       ar1.add(0);// this adds works
       ar1.add(s);// but this is not working throw error 
      if(d==ar.get(ar.size()-1))
      {
          printpath(ar);
      }
        while(it.hasNext())
        {
            printAllPaths(it.next(),d,ar);
        }
    }
}

`

Ответы [ 4 ]

3 голосов
/ 16 июня 2020

Вероятно, ошибка возникает при ar.get(ar.size()-1)

Проверьте размер ar перед попыткой получить элемент.

Если размер 0, тогда будет outOfIndex.

if(!ar.isEmpty() && d == ar.get(ar.size()-1)) {
  printpath(ar);
}

isEmpty проверяет, является ли ArrayList пустым, означает size равно 0 или нет.

Чтобы избежать исключения out of bound, добавлено !(not)Empty проверьте

0 голосов
/ 16 июня 2020

Невозможно опубликовать комментарий из-за низкой репутации, но, чтобы добавить, я считаю, что ArrayLists не выдает OutOfBoundsException при вызове функции add(), поскольку ArrayLists автоматически поддерживает свою емкость (одна из причин, по которой они популярны) .

Вы также можете в любое время вызвать ensureCapacity(int minCapacity), чтобы убедиться, что в ArrayList достаточно места, minCapacity - это количество пустых слотов, которые вам нужны. Однако в этом нет необходимости.

Я удалю это, если размещать здесь не рекомендуется.

0 голосов
/ 16 июня 2020

Вероятность того, что вы прокомментировали номер строки для исключения, неверна. Наибольшие шансы на исключение будут в следующей строке внутри if condition - Потому что здесь вы пытаетесь получить значение из списка массивов, передавая индекс его размера -1 (ei ar.size () -1). Самым первым, когда массив пуст, ar.size () возвращает 0, в этот момент ar.get (-1) выдаст исключение ei IndexOutOfBoundsException

Примечание: целевой индекс должен быть в диапазоне от 0 до размера списка (0 <= index <= list.size ()) </strong>

добавить дополнительную проверку if условие

if(ar.size()>0 && d==ar.get(ar.size()-1)){
        // process
}

Или

if(!ar.isEmpty() && d==ar.get(ar.size()-1)){
        // process
}
0 голосов
/ 16 июня 2020

Не могли бы вы опубликовать полную трассировку стека и как вы вызываете описанный выше метод?

Сначала я предполагаю, что ваш код бросает, когда вы выполняете get, а не когда вы вызываете add.

...