Почему я получаю ArrayIndexOutOfBoundsException в этом конкретном коде? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть нечто похожее на это в алгоритме Дейкстры, но я не получаю ошибки в этом.Я пытался подставить различные значения для целочисленного максимума и других различных вещей, но ничего не работает.Я также искал этот сайт и другие, но не нашел ничего, что могло бы помочь.Также, если это имеет значение, мой класс графа находится в классе сам по себе.Любая помощь будет оценена.Я обновил свой вопрос ... вопрос был дан ответ.Но я переформатировал только на тот случай, если кто-то еще захочет посмотреть.

          public static void main(String[] args)
              {

                  final static int V=7;
                  static final int E=13;

                 Graph graph=new Graph(V,E);

                graph.edge[0].src = 1; 
                graph.edge[0].dest = 2; 
                graph.edge[0].weight = 5; 

                graph.edge[1].src = 1; 
                graph.edge[1].dest = 3; 
                graph.edge[1].weight = 8; 

                graph.edge[2].src = 1; 
                graph.edge[2].dest = 5; 
                graph.edge[2].weight = 7; 

                graph.edge[3].src = 1; 
                graph.edge[3].dest = 6; 
                graph.edge[3].weight = 10; 

                graph.edge[4].src = 2; 
                graph.edge[4].dest = 3; 
                graph.edge[4].weight = -2; 

                graph.edge[5].src = 2; 
                graph.edge[5].dest = 5; 
                graph.edge[5].weight = -2; 

                graph.edge[6].src = 3; 
                graph.edge[6].dest = 4; 
                graph.edge[6].weight = 6; 

                graph.edge[7].src = 5; 
                graph.edge[7].dest = 4; 
                graph.edge[7].weight = 4; 

                graph.edge[8].src = 5; 
                graph.edge[8].dest = 6; 
                graph.edge[8].weight = 2;

                graph.edge[9].src = 5; 
                graph.edge[9].dest = 7; 
                graph.edge[9].weight = 7;

                graph.edge[10].src = 6; 
                graph.edge[10].dest = 7; 
                graph.edge[10].weight= -1; 

                graph.edge[11].src = 7; 
                graph.edge[11].dest = 3; 
                graph.edge[11].weight = 4;

                graph.edge[12].src = 7; 
                graph.edge[12].dest = 4; 
                graph.edge[12].weight = 5;




         Graph.BellmanFord(graph,0);

      }



          public class Graph 
       {


          public class Edge { 
          int src, dest, weight; 
           Edge() { 
          src = dest = weight = 0; 
        } 
       }; 

       int V, E; 
       Edge edge[]; 

       Graph(int v, int e) 
        { 
        V = v; 
        E = e; 
        edge = new Edge[e]; 
       for (int i=0; i<e; ++i) 
           edge[i] = new Edge(); 
      }



      static void bellmanford(Graph graph , int src )
       {

         int V = graph.V, E = graph.E; 
         int dist[]=new int[V];

          for (int i=0; i<V; ++i) 
          dist[i] = Integer.MAX_VALUE; 
          dist[src] = 0; 



        for (int i=1; i<V; ++i) 
       { 
       for (int j=0; j<E; ++j) 
       { 
         int u = graph.edge[j].src; 
         int v = graph.edge[j].dest; 
         int weight = graph.edge[j].weight; 
         if (dist[u]!=Integer.MAX_VALUE && // I’m getting the error        
         here.
               dist[u]+weight<dist[v]) 
                dist[v]=dist[u]+weight; 
        } 
        } 

        for (int j=0; j<E; ++j) 
        { 
       int u = graph.edge[j].src; 
       int v = graph.edge[j].dest; 
       int weight = graph.edge[j].weight; 
       if (dist[u]!= Integer.MAX_VALUE && 
       dist[u]+weight < dist[v]) 
       System.out.println("Graph contains negative weight cycle"); 


        }

         printdistb(dist,V);
       }


     static void printdistb(int dist[], int V) 
     { 
    System.out.println("Vertex   Distance from Source"); 
    for (int i = 0; i< V; ++i) 
    System.out.println(i+"            "+dist[i]); 
     } 

1 Ответ

0 голосов
/ 11 декабря 2018

Вы объявляете массив dist[] длиной V.И затем вы используете graph.edge[j].src в качестве индекса для массива dist[].Вот почему вы получаете ArrayIndexOutOfBoundsException.Короче говоря, это означает, что значение src больше, чем V.

Исправление

Увеличьте длину dist[] на 1.

Внутри static void bellmanford(){...} изменение с

int dist[] = new int[V];

на

int dist[] = new int[V+1];

Это действительно решило проблему исключений для меня.Но, кажется, есть более логичные проблемы с алгоритмом (реальная проблема может быть скрыта где-то еще).Но, по крайней мере, программа выполняется сейчас, чтобы вы могли ее отладить.Удачи.

...