Topic: 请大家帮我看下这个程序 谢谢(空指针异常 Graph)

  Print this page

1.请大家帮我看下这个程序 谢谢(空指针异常 Graph) Copy to clipboard
Posted by: hawkie
Posted on: 2005-05-30 12:34

请尽量用准确的文字描述作为标题
Please use [ code ]



请大家帮我看下 这个程序 谢谢
能编译成功,但运行时 会出来一个 空指针异常 :

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;

public Graph(int v ,boolean isDig)
{
vexCount = v;
edgeCount = 0;
digraph = isDig;
Nodes = new gNode[vexCount];
for(int i = 0; i < vexCount; i++)
{
System.out.println("请输入第"+(i+1)+"个顶点的值:");
Nodes[i].value = input.getInt() ;
}
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 )
{
Nodes[v].adj.addWilted Rose;
if(!isDigraph())
{
Nodes[w].adj.add(v);
edgeCount++;
}
edgeCount++;
}
}

class gNode //图中的顶点
{
public int value;
public adjList adj;
public gNode( int v )
{
value = v ; adj = new adjList();
}
}

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

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.addWilted Rose;
    }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