Topic: 请大家帮我看下这个程序 谢谢(空指针异常 Graph) |
Print this page |
1.请大家帮我看下这个程序 谢谢(空指针异常 Graph) | Copy to clipboard |
Posted by: hawkie Posted on: 2005-05-30 12:34 请尽量用准确的文字描述作为标题 Please use [ code ] 请大家帮我看下 这个程序 谢谢 能编译成功,但运行时 会出来一个 空指针异常 :
|
2.Re:请大家帮我看下 这个程序 谢谢 [Re: hawkie] | Copy to clipboard |
Posted by: hawkie Posted on: 2005-05-30 17:10 大家帮个忙 好吗? 我怎么看都找不到 错在那里了 !!! 都研究它好几天了啊 !!! |
3.Re:请大家帮我看下 这个程序 谢谢 [Re: hawkie] | Copy to clipboard |
Posted by: undefined Posted on: 2005-06-02 22:43 import java.io.*; public class GraphTest { public static void main(String[] args) { Graph G = new Graph(5, false); GraphDFS show = new GraphDFS(G); } } class GraphDFS { private boolean[] visited; int i; public GraphDFS(Graph G) { visited = new boolean[G.getVexs()]; for (i = 0; i < visited.length; i++) visited[i] = false; for (i = 0; i < G.getVexs(); i++) if (!visited[i]) DFS(G, i); } private void DFS(Graph G, int i) { System.out.println(G.Nodes[i].value); visited[i] = true; while (!G.Nodes[i].adj.eof()) { if (!visited[G.Nodes[i].adj.value()]) DFS(G, G.Nodes[i].adj.value()); G.Nodes[i].adj.goNext(); } } } class Graph { private int vexCount; private int edgeCount; private boolean digraph; public gNode[] Nodes=null; public Graph(int v, boolean isDig) { vexCount = v; edgeCount = 0; digraph = isDig; Nodes = new gNode[vexCount]; System.out.println(vexCount); for (int i = 0; i < vexCount; i++) { System.out.println("请输入第" + (i + 1) + "个顶点的值:"); Nodes[i]=new gNode(input.getInt()); //Nodes[i].setValue(input.getInt()); //System.out.println("GGGGGGGGGGGGG"); } System.out.println("\n请输入边数:"); int e = input.getInt(); for (int i = 0; i < e; i++) { System.out.println("请输入第" + (i + 1) + "条边的起始顶点序号:"); int ve = input.getInt(); System.out.println("请输入第" + (i + 1) + "条边的终止顶点序号:"); int w = input.getInt(); addEdge(ve, w); } } int getVexs() { return vexCount; } int getEdges() { return edgeCount; } boolean isDigraph() { return digraph; } void addEdge(int v, int w) { if(v<vexCount) { Nodes[v].adj.add; }else { System.out.println("ERROR"); } if (!isDigraph()) { if(w<vexCount) { Nodes[w].adj.add(v); edgeCount++; }else { System.out.println("ERROR"); } } edgeCount++; } } class gNode //图中的顶点 { public int value; public adjList adj; public gNode(int v) { value = v; adj = new adjList(); } public void setValue(int v) { value=v; } } class adjList //邻接表 { private gEdge e, current; public adjList() { e = null; current = e; } public void add(int vex) { e = new gEdge(vex, 0, e); current = e; } public void add(int vex, int weight) { e = new gEdge(vex, weight, e); current = e; } public int value() { return current.v; } public int weight() { return current.weight; } public void goNext() { if (!eof()) current = current.next; } public void goFirst() { current = e; } public boolean eof() { return current == null; } } class gEdge //邻接表中的结点 { int v, weight; gEdge next; public gEdge(int vex, int w, gEdge g) { v = vex; weight = w; next = g; } } class input { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static String s; static int p; public input() { s = ""; p = 0; } public static String getString() { try { s = br.readLine(); } catch (IOException e) { System.out.println("IO Error !"); }; return s; } public static int getInt() { String t; t = getString(); try { p = Integer.valueOf(s.trim()).intValue(); } catch (NumberFormatException e) { // 您的输入有误 return 0; } return p; } } |
4.Re:请大家帮我看下 这个程序 谢谢 [Re: hawkie] | Copy to clipboard |
Posted by: undefined Posted on: 2005-06-02 22:50 我简单的看了下,给你改了一些错误的地方,现在可以运行了~~ 不知道这样改是不是满足你的需求~ 你的错误都在数组上,首先是Graph类的构造器里~ 你new了一个gNode类型的数组,但是他只是这个类型的数组而已,数组的里面却是空空,你直接拿一个空的数组来调用gNode的属性和方法当然会有空指针异常.你必须给数组里加上gNode类的对象,才可以调用呀~ 这个错误改了之后,会跳到后面还有一个错误,是数组索引超过边界的错误~~ 你在你最早的main函数里, Graph G = new Graph(5, false); 已经确定是传入的第一个参数是"5"这样便确定了Nodes[v]数组的长度~~ 当你后面在控制台输入的数字如果大于5就会出错了~~我给加了一个条件,这样就不会有异常抛出,相对比较人性化一点了~ |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |