2013-12-15 3 views
0

Не могу найти причину, по которой я получаю это исключение NullPointException. Это указывает на две конкретные линии.NullPointerException не может найти ошибку

Это ошибка:

Exception in thread "main" java.lang.NullPointerException 
at Railroad.dijkstra(Railroad.java:52) 
at Railroad.main(Railroad.java:36) 

Эти 2 строки:

dijkstra(A); 

for (Edge x : w.edges){ 

Это весь код для удобства:

проводки весь код легче понять, где Я иду. Надеюсь, это поможет, спасибо!

Vertex[] vertices = { A, B, C, D, E, F, G, H, I, J, K, L, M }; 
    dijkstra(A); 
    for (Vertex v : vertices) 
{ 
    System.out.println("Distance to " + v + ": " + v.shortestDist); 
    List<Vertex> trip = cheapestTrip(v); 
    System.out.println("Path: " + trip); 
} 
} 

public static void dijkstra(Vertex s){ 
    s.shortestDist = 0; 
    PriorityQueue<Vertex> cityQueue = new PriorityQueue<Vertex>(); 
    cityQueue.add(s); 

    while(!cityQueue.isEmpty()){ 
     Vertex w = cityQueue.poll(); 
     for (Edge x : w.edges){ 
      Vertex v = x.city; 
      int price = x.price; 
      int priceOfTrip = w.shortestDist + price; 
      if(priceOfTrip < v.shortestDist){ //relaxes the edge that it's on 
       cityQueue.remove(v); 
       v.shortestDist = priceOfTrip; 
       v.prev = w; 
       cityQueue.add(v); 
      } 
     } 
    } 

} 
+0

Можете ли вы указать строку Railroad.java:52 в своем коде? –

+1

@AlexandreLavoie Он сделал. – chrylis

+1

Пожалуйста, разместите код для Vertex. Я подозреваю, что поле 'edge' объекта' Vertex' не получает инициализацию должным образом. – chrylis

ответ

1

Вы получаете NullPointerException, потому что edges поле на вашем Vertex объект не получает правильно инициализирован. Как правило, лучше всего использовать поля private и геттеры; это вызвало бы предупреждения о потенциальной проблеме.

В вашем классе Vertex вы должны инициализировать edges. Поскольку вы не разместили код, мы не знаем, какой тип это, но если это Set, например, вы могли бы сказать:

Set<Edge> edges = Collections.emptySet(); // if you are going to replace edges 
Set<Edge> edges = new HashSet<>();  // if you are going to use edges.add() 

Edit:edges является массивом. Тот же принцип применяется; вы не устанавливаете переменную edges в любом месте, и поэтому она по умолчанию равна null. Значение по умолчанию, предотвратит непосредственную проблему является

Edge[] edges = new Edge[0]; 

но вы лучше рефакторинга к типу коллекции, которая позволит вам добавить произвольное число ребер, а лучше еще рефакторинг для обеспечения поля герметизации между вашим различным классы.

Edit 2: Конкретная проблема с K (DC) и M (Нью-Йорк). Вы устанавливаете поле edges в других городах, но не на тех.

+0

Я только что опубликовал весь свой код, возможно, это станет более ясным. Я почти уверен, что делаю это правильно, если нет чего-то, чего я не вижу, я думаю. – user2318083

+0

LIFE SAVER, вот и все! Благодаря!! :) О, и причина, по которой я не устанавливал край на M (NY), был потому, что это был последний узел/город, поэтому он не имеет одного – user2318083

Смежные вопросы