agregar un elemento en bruto como ar1.add (0) está bien, no arroja un error, pero al intentar agregar ar1.add (s) arroja un error
** el error no está en la matriz ar el error está en la matriz ar1 que está teniendo instancia en el método **

¿hay alguna solución para esto?
``

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);
        }
    }
}

`

-2
utkarsh singh 16 jun. 2020 a las 14:11

4 respuestas

La mejor respuesta

El error probablemente ocurre en ar.get(ar.size()-1)

Verifique el tamaño de ar antes de intentar obtener el elemento.

Si el tamaño es 0, aparecerá outOfIndex.

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

isEmpty comprueba si ArrayList está vacío significa que size es 0 o no.

Para evitar la excepción out of bound, se agregó la verificación !(not)Empty

3
Gibbs 16 jun. 2020 a las 11:22

No se puede publicar un comentario debido a una baja representación, pero para agregar, creo que las ArrayLists no arrojan un OutOfBoundsException cuando se llama a la función add() ya que las ArrayLists mantienen automáticamente su capacidad (una de las razones por las que son populares )

También puede llamar en cualquier momento ensureCapacity(int minCapacity) para asegurarse de que ArrayList tenga suficiente espacio, minCapacity es el número de espacios vacíos que necesita. Sin embargo, no es necesario.

Eliminaré esto si no es una buena práctica publicar aquí.

0
HolyKritGrenade 16 jun. 2020 a las 13:24

La probabilidad de que haya comentado en el número de línea de la Excepción es incorrecta. La mayoría de las posibilidades para la excepción estarían en la siguiente línea adentro si la condición- Porque aquí está intentando obtener el valor de una lista de matriz pasando un índice de su tamaño -1 (e.i ar.size () -1). En su primer momento cuando la matriz está vacía, ar.size () devuelve 0, en ese punto de tiempo ar.get (-1) arrojará una excepción e.i IndexOutOfBoundsException

Nota: el índice de destino debe estar en el rango de 0 para el tamaño de la lista (0 <= índice <= list.size ())

Agregue un control adicional en si condición

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

O

if(!ar.isEmpty() && d==ar.get(ar.size()-1)){
        // process
}
0
Jimmy 16 jun. 2020 a las 12:01

¿Podría publicar el seguimiento completo de la pila y cómo llamar al método anterior?

Mi primera suposición es que su código se está lanzando cuando está haciendo get, no cuando está llamando a add.

0
burm87 16 jun. 2020 a las 11:22