注册 登录
编程论坛 JAVA论坛

这段代码一直报空指针,找不到解决方案

王小翔 发布于 2017-05-31 16:52, 4171 次点击
//这个是domain里边的

package edu.njcc.rj1621.domain;

import java.util.ArrayList;
import java.util.List;

public class ObjectTreeNode {

    private Object object;
    private List<ObjectTreeNode> children;
   
    public ObjectTreeNode() {
        this.children= new ArrayList<ObjectTreeNode>();
    }
   
   
    public ObjectTreeNode(Object object) {
        this.object = object;
    }


    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
    public List<ObjectTreeNode> getchildern() {
        return children;
    }
    public void setList(List<ObjectTreeNode> children) {
        this.children = children;
    }
    public void addChild(ObjectTreeNode obj){
        this.children.add(obj);
    };
   
   
   
}


//这个是Client里边的 可以忽略showBbsTree这个方法 因为还没运行到那 是在list2Tree里边报错的 我会在后边贴运行结果

package edu.njcc.rj1621.client;

import java.util.List;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import edu.njcc.rj1621.domain.Bbs;
import edu.njcc.rj1621.domain.BbsTreeNode;
import edu.njcc.rj1621.domain.ObjectTreeNode;
import edu.njcc.rj1621.service.BbsSvr;
import edu.njcc.rj1621.service.BbsSvrImpl;

public class CopyOfTestBbsQueryList {



    public static void main(String[] args) {

        BbsSvr bbsSvr = new BbsSvrImpl();
        List<Bbs> list = bbsSvr.queryBbsList(1);
        
        ObjectTreeNode ob = new ObjectTreeNode();
        Object list2 = list;
        
        for (Bbs bbs : list) {
            if (bbs.getBbsPid() == 0) {
                ObjectTreeNode child = new ObjectTreeNode(bbs);
                list2Tree(child, list2);
                ob.getchildern().add(child);
               
            }
        }
        List<ObjectTreeNode> children = ob.getchildern();
//        for (ObjectTreeNode child : children) {
//            showBbsTree(child,0);
//        }
    }

    private static void showBbsTree(ObjectTreeNode root,int level) {
        
        for (int i = 0; i < level; i++) {
            System.out.print("\t");
        }
        
        
        Object object = root.getObject();
        Method method;
        try {
            method = object.getClass().getMethod("getContent", null);
            Object invoke = method.invoke(object, null);
            System.out.println(invoke);
            List<ObjectTreeNode> list = root.getchildern();

            
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        
//        List<BbsTreeNode> children = root.getChildren();
//        for (BbsTreeNode child : children) {
//            showBbsTree(child,level+1);
//        }
    }


    private static void list2Tree(ObjectTreeNode root, Object list) {
         
        List list1=(List) list;
        for (Object object : list1) {
            try {
                try {
                    Object object2 = root.getObject();
                    Method m2 = object2.getClass().getMethod("getBbsId", null);
                    Method m1 = object.getClass().getMethod("getBbsPid", null);
                    Object invoke = m1.invoke(object, null);
                    Object invoke2 = m2.invoke(object2, null);
                    String string = invoke.toString();
                    String string2 = invoke2.toString();
                    int i = Integer.parseInt(string);
                    int j = Integer.parseInt(string2);
//                    System.out.println(string);
//                    System.out.println(string2);
                    if (i==j) {
                        System.out.println("你进来了");
                        ObjectTreeNode obj = new ObjectTreeNode(object);
                        list2Tree(obj,list);
                        System.out.println("你到第二步了");
                        root.addChild(obj);
                    }
                           
                    
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
   
    }

}

//这是运行结果
你进来了
你进来了
你进来了
你到第二步了
Exception in thread "main" java.lang.NullPointerException
    at edu.njcc.rj1621.domain.ObjectTreeNode.addChild(ObjectTreeNode.java:34)
    at edu.njcc.rj1621.client.CopyOfTestBbsQueryList.list2Tree(CopyOfTestBbsQueryList.java:96)
    at edu.njcc.rj1621.client.CopyOfTestBbsQueryList.list2Tree(CopyOfTestBbsQueryList.java:94)
    at edu.njcc.rj1621.client.CopyOfTestBbsQueryList.list2Tree(CopyOfTestBbsQueryList.java:94)
    at edu.njcc.rj1621.client.CopyOfTestBbsQueryList.main(CopyOfTestBbsQueryList.java:28)

请大佬看看啊
15 回复
#2
林月儿2017-05-31 22:26
Exception in thread "main" java.lang.NullPointerException
    at edu.njcc.rj1621.domain.ObjectTreeNode.addChild(ObjectTreeNode.java:34)
报错信息可以追溯错误出处吧,先对照自己分析一下
#3
王小翔2017-06-02 08:23
回复 2楼 林月儿
就是 add那出错  完全分析不出来
#4
林月儿2017-06-02 12:44
ob.getchildern().add(child);这句话上面加一句打印ob.getchildern()的语句,看看它是不是空呗
#5
王小翔2017-06-02 13:07
回复 4楼 林月儿
你好,可以给个QQ或者什么联系方式吗?我困扰好几天了,是在解决不了,实在感谢。、
#6
王小翔2017-06-02 13:08
回复 4楼 林月儿
我改进了一下方法,然后那个显示命令的窗口直接被错误爆满了。完全没有头绪
#7
calix2017-06-02 16:09
public ObjectTreeNode(Object object) {
    this.object = object;
}
你实例化的时候调用的是这个有参的构造函数,children这个字段没有被初始化
#8
王小翔2017-06-02 21:36
回复 7楼 calix
哇 ,谢谢就是这个问题,我以为那个没有构造参数的方法和那个有构造参数的构造方法,可以同时自动被调用。又长知识了。真的非常感谢
#9
王小翔2017-06-02 21:36
回复 8楼 wanlu
非常感谢 我知道了谢谢
#10
王小翔2017-06-02 21:37
回复 4楼 林月儿
非常感谢你我知道了 楼下帮我解决了。
#11
王小翔2017-06-02 21:38
回复 4楼 林月儿
非常感谢 我知道怎么解决了 楼下帮到我了。
#12
林月儿2017-06-02 22:52
回复 12楼 王小翔
空值调用会导致空指针异常,这点你其实可以根据错误信息独立分析出来的。不过有人为你指点迷津也挺好。不用谢我,没帮到你呢
#13
王小翔2017-06-03 12:58
回复 13楼 林月儿
主要是我不知道,当参数的构造方法 和没有参数的构造方法都存在,调用有参数的构造方法 另一个无参数的就不会执行了,这个只是点被我给忘了。
#14
林月儿2017-06-03 13:09
回复 14楼 王小翔
还是对自己写的代码太自信,空值异常很容易联想到对象实例化有问题,然后根据报错定位哪个对象实例化失败,为啥失败。这才是顺序,不是你说的那样,因为空参构造器没被调所以空值异常,那是找到问题之后的推断。

还是认为类似问题通过上述方式解决,报错信息很重要,定位比较快原因也很明确。
1