2013-11-27 25 views
3

爲什麼我得到這個程序的NULL指針錯誤,據我所看到的一切看起來很好,我剛開始使用JGraphT並需要一點幫助。讓加權圖在JGraphT中工作

語境: 我需要能夠航班添加到圖表,每一次飛行是雙向的,並且飛行應與他們的價格進行加權。

錯誤:

run: 
Please enter the number of flights: 
2 
Please enter the flight destination for flight 1: 
Edinburg 
Please enter the flight destination for flight 2: 
Heathrow 
Enter the edges 
Edinburg 
Heathrow 
Please enter a price for this edge: 
25.99 
Exception in thread "main" java.lang.NullPointerException 
    at org.jgrapht.graph.AbstractBaseGraph.setEdgeWeight(Unknown Source) 
    at graphapp.MyGraph.setEdgeWeight(MyGraph.java:25) 
    at graphapp.GraphApp.main(GraphApp.java:33) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 14 seconds) 

MyGraph.java(類):

package graphapp; 

import org.jgrapht.*; 
import org.jgrapht.graph.*; 
import org.jgrapht.alg.KruskalMinimumSpanningTree; 

public class MyGraph { 

    private final SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> g = new SimpleDirectedWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class); 
    static final double DEFAULT_EDGE_WEIGHT=19; 
    //DefaultWeightedEdge > (DefaultWeightedEdge.class); 
    private DefaultWeightedEdge e1; 

    public void addVertex(String name) { 
     g.addVertex(name); 
     //graph.addVertex(name); 
    } 

    public void addEdge(String v1, String v2) { 
     g.addEdge(v1, v2); 
     e1 = g.addEdge(v1, v2); 
    } 

    public void setEdgeWeight(String EDGE_WEIGHT) { 
     g.setEdgeWeight(e1, Double.valueOf(EDGE_WEIGHT));   
    } 

    public SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> getGraph() { 
     return g; 
    } 

    /*public SimpleWeightedGraph<String,DefaultWeightedEdge> getGraph() { 
     return graph; 
    }*/ 

    public void getSpanningTree() { 
     KruskalMinimumSpanningTree k = new KruskalMinimumSpanningTree(g); 
     System.out.println(k.getEdgeSet().toString()); 
     //KruskalMinimumSpanningTree k1=new KruskalMinimumSpanningTree(graph); 
     //System.out.println(k1.getEdgeSet().toString()); 
    } 

    public void getSpanningTreeCost() { 
     KruskalMinimumSpanningTree k = new KruskalMinimumSpanningTree(g); 
     System.out.println(k.getSpanningTreeCost()); 
    } 
} 

GraphApp(主):

package graphapp; 
import org.jgrapht.demo.*; 
import java.util.Scanner; 
import graphapp.*; 
public class GraphApp{ 

    public static void main(String args[]) { 

     int x; 
     Scanner sc = new Scanner(System.in); 
     MyGraph my = new MyGraph(); 
     System.out.println("Please enter the number of flights: "); 
     int no_of_ver = sc.nextInt(); 

     for(int i=1;i <= no_of_ver;i++) { 
      System.out.println("Please enter the flight destination for flight "+i+ ":"); 
      my.addVertex(sc.next()); 
     } 

     do { 
      System.out.println("Enter the edges"); 
      String e1 = sc.next(); 
      String e2 = sc.next(); 
      my.addEdge(e1, e2); 

      System.out.println("Please enter a price for this edge:"); 
      my.setEdgeWeight(sc.next()); 
      System.out.println("Continue... Yes:1 ********** No:0"); 
      x=sc.nextInt(); 
     } while(x==1); 

     System.out.println("Graph\n" + my.getGraph().toString()); 
     System.out.println("\n\n**********Spanning Tree*********"); 
     my.getSpanningTree(); 
     System.out.println("\nSpanning Tree Cost"); 
     my.getSpanningTreeCost(); 
    } 
} 
+0

你檢查'g','e1'和'EDGE_WEIGHT'不是當setEdgeWeight方法拋出異常空? – forgivenson

+0

我知道g不是零點,就好像我刪除導致錯誤的部分一樣,g設置得很好。但我看不出g和e1的問題,因爲它們只是簡單的調用。 –

+0

好的,顯然e1沒有設置。它在文檔中說,添加完成後會返回邊緣。 –

回答

5

我的錯誤是用這種方法:

public void addEdge(String v1, String v2) { 
    g.addEdge(v1, v2); 
    e1 =g.addEdge(v1, v2); 
    System.out.println("Edge added: " + e1.toString()); 
} 

我需要把它改成這樣:

public void addEdge(String v1, String v2) { 
    e1 =g.addEdge(v1, v2); 
    System.out.println("Edge added: " + e1.toString()); 
}