提示空指针异常,应该是对一个未实例化的对象进行了操作.
    public void Append(int intTempInput){
        
        singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
        if ( ListIsEmpty() )
        {
            headNode.next = tempNode; //链表为空哪里来的结点.
            tailNode = tempNode;
            headNode.info = 1;
         }
        else
        {
            tailNode.next = tempNode;
            tailNode = tailNode.next;
            headNode.info++;
            
        }
}

解决方案 »

  1.   

    bwsabc(javavaj) :
        在主程序的开始,我一开始就这样实例化了单链表啊,
        singleLinkList userLinkList = new singleLinkList();
    ======================================================================================    public static void main(String[] args) {  
            int intUserInput;
            singleLinkList userLinkList = new singleLinkList();
            userLinkList.Append(9);
            userLinkList.Append(12);
            
            
        }
        
    }
    =========================================================================
    我后来以为是tailNode和headNode没有实例化,在
    单链表类的构造函数里面改成这样,
       public singleLinkList() {
           singleLinkListNode headNode = new singleLinkListNode();
           singleLinkListNode tailNode = new singleLinkListNode();
        }
    但是运行的结果还是一样的。不知道哪里还是不对啊!!!苦恼苦恼!!!
      

  2.   

    /**在单链表表尾添加节点*/
        public void Append(int intTempInput){
            
            singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
            if ( ListIsEmpty() )
            {
                headNode.next = tempNode;
                tailNode = tempNode;
                headNode.info = 1;
             }
            else
            {
                tailNode.next = tempNode;
                tailNode = tailNode.next;
                headNode.info++;
                
            }
    }
    这里有问题吧。如果ListIsEmpty()为真,那个headNode = Null,那个headNode.next这个就不对了。你的头节点和尾节点都没初始化
      

  3.   

    自己做可以参考一下LinkedList.java类是如何实现的。
    如果想用,给你个例子:
    import java.util.*;
    class abc
    {
    public static void main(String [] args)
    {
    LinkedList list1=new LinkedList();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    System.out.print(list1.get(2));
    System.out.print(list1.getFirst());
    System.out.print(list1.getLast());
    }
    }
      

  4.   

    我改写了一下:
    (※※※※※     ※※※※※)之间为我增加的输出部分,查看结果的
    =====(主程序)============
    public static void main(String[] args) {  
            int intUserInput;
            singleLinkList userLinkList = new singleLinkList();
            userLinkList.Append(9);
            userLinkList.Append(12);
            
            
        }========(单链表类)===============
    package singlelinklist;public class singleLinkList {
        
       /**定义单链表的头结点和尾结点*/
        private singleLinkListNode headNode;
        private singleLinkListNode tailNode;
        
           public singleLinkList() {
           singleLinkListNode headNode = new singleLinkListNode();
           singleLinkListNode tailNode = new singleLinkListNode();
           tailNode=headNode;   ※※※※※1  printNode(headNode);  ※※※※※
       ※※※※※2  printNode(tailNode);  ※※※※※    }
        
        public boolean ListIsEmpty(){
            if ( headNode.info==0 )
                    return true;
            else
                return false;
            
        }
        
        public void printAll(){
            singleLinkListNode temp;
            for(temp=headNode;temp!=null;temp=temp.next)
                System.out.print(temp.info+"|"+temp.next+"==>");
        }
        
        public void printNode(singleLinkListNode printNode){
             System.out.println(printNode+" || "+printNode.info+" | "+printNode.next+" ==> ");
        }
        
        /**在单链表表尾添加节点*/
        public  void  Append(int intTempInput){
            
            singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
           
           ※※※※※3   printNode(tempNode);    ※※※※※
           ※※※※※4   printNode(headNode);    ※※※※※
           ※※※※※5   printNode(tailNode);    ※※※※※
            
            if ( ListIsEmpty() )
            {
                headNode.next = tempNode;
                tailNode = tempNode;
                headNode.info = 1;
             }
            else
            {
                tailNode.next = tempNode;
                tailNode = tailNode.next;
                headNode.info=headNode.info+1;
                
            }
    }    
    }==========(单链表结点类)==========
    package singlelinklist;/**
     *
     * @author Administrator
     */
    public class singleLinkListNode {
        
        int info;
        singleLinkListNode next;
            
        /** Creates a new instance of singleLinkListNode */
        public singleLinkListNode()
        {
            this(0,null);
        }
        public singleLinkListNode(int i) {
            info = i;
            next = null;         
        }
        
        public singleLinkListNode(int i, singleLinkListNode n){
            info = i;
            next = n;    
        }   
        
    }
    ========(运行输出)============
    run:
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> 
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> 
    singlelinklist.singleLinkListNode@765291 || 9 | null ==> 
    java.lang.NullPointerException
        at singlelinklist.singleLinkList.printNode(singleLinkList.java:43)
        at singlelinklist.singleLinkList.Append(singleLinkList.java:51)
        at singlelinklist.Main.main(Main.java:21)
    Exception in thread "main" 
    Java Result: 1
    生成成功(总时间:1 秒)singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>  
    应该是※※※※※1  printNode(headNode);  ※※※※※的输出
      
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>  
    应该是※※※※※2  printNode(tailNode);  ※※※※※的输出
    上面应该表明headNode 和tailNode已经被初始化了啊。singlelinklist.singleLinkListNode@765291 || 9 | null ==> 
    应该是※※※※※3  printNode(tempNode);  ※※※※※的输出问题是在输出※※※※※4   printNode(headNode);    ※※※※※时出错,说是空指针异常,为什么我明明在上面已经初始化了,到这里确又没有,怎么回事呢???
      

  5.   

    运行的时候headNode对象是NULL,所以会报空指针的错.
      

  6.   

    // No problem
    public class SingleLinkListNode {
      int info;
      SingleLinkListNode next;
            
      /** Creates a new instance of singleLinkListNode */
      public SingleLinkListNode() { this( 0, null ); }
      
      public SingleLinkListNode( int i ) {
        /* 没有错误,但是引用一个构造函数可以使程序本身清晰可读
        info = i;
        next = null;
        */
        this( i, null );
      }
        
      public SingleLinkListNode( int i, SingleLinkListNode n ) {
        info = i;
        next = n;
      }
        
      public boolean nodeInfoIsEmpty( SingleLinkListNode m ) {
        /* 没有错误,修改一下,能够提高代码效率
        if (m.info==0)
          return true;
        else
          return false;
        */
        return m.info == 0;
      }   
    }
    =======================================================
    // 较大逻辑错误
    public class SingleLinkList {
      /* 初始化动作放入构造函数为好  
      private SingleLinkListNode headNode = 
        new SingleLinkListNode();
      private SingleLinkListNode tailNode =
        new SingleLinkListNode();
      */
      private SingleLinkListNode 
        headNode,    // The header node of linked list
        tailNode;    // The tail node of linked list
        
      /** Creates a new instance of singleLinkList */
      public SingleLinkList() {
        headNode = new SingleLinkListNode();  // 制造一个链表时,初始化一个头节点,并保证其next域为空
        tailNode = headNode;  // 初始化时,尾节点等于头节点
      }
        
      public boolean ListIsEmpty(){
        /* 错误,链表为空意味着,头节点的next域无下一个节点的引用,
           而不是头节点为空
        if( headNode == null )
          return true;
        else
          return false;
        */    return headNode.next == null;
      }
        
      public void printAll() {
        SingleLinkListNode temp;
        
        for( temp=headNode; temp!=null; temp=temp.next )
          System.out.print(temp.info+"|"+temp.next+"==>");
      }
        
      /**ÔÚµ¥Á´±í±íβÌí¼Ó½Úµã*/
      public void Append( int intTempInput ) {
        SingleLinkListNode tempNode = new SingleLinkListNode( intTempInput );
        // 由于之前修改了空链表的定义,所以当前链表为空的概念是
        // headNode.next = null,以下逻辑正确。
        if( ListIsEmpty() ) {
          headNode.next = tempNode;
          tailNode = tempNode;
          headNode.info = 1;
        }
        else {
          tailNode.next = tempNode;
          tailNode = tailNode.next;
          headNode.info++;     
        }
      }  
    } /// @.@||~// 以上经过修改并运行通过,Main class 无须修改。
      

  7.   

    谢谢 midthinker(呵呵) ,基本解决了。
    不过小弟还有一个问题没搞懂,在singleLinkList(单链表中)
    是这样的,
    ==========================================
    public class singleLinkList {
        
       /**定义单链表的头结点和尾结点*/
      private singleLinkListNode headNode =  new singleLinkListNode();
      private singleLinkListNode tailNode = new singleLinkListNode();     /** Creates a new instance of singleLinkList */
         public singleLinkList() {
           singleLinkListNode headNode = new singleLinkListNode();
           tailNode=headNode;
           printNode(headNode);
           printNode(tailNode);
        }
    ======================================
    为什么headNode被两次new?在运行的时候我输出内容查看链表结点的情况,是这样的:
    /*下面是 singleLinkList(单链表类)构造函数里面输出的headNode 和tailNode的结点情况*/
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为9的结点和 tailNode的结点情况
    singlelinklist.singleLinkListNode@765291 || 1 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【info为9的结点】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为12的结点和 tailNode的结点情况
    singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【tailNode】*//*下面是添加了全部的结点9,12后,整个链表的情况
    singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | singlelinklist.singleLinkListNode@14f8dab ==> /*【info为9的结点】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】同时也是【tailNode】*/可以看出headNode被两次new,前一次地址是singlelinklist.singleLinkListNode@1ac04e8
                               后一次是singlelinklist.singleLinkListNode@765291 
    为什么需要这样呢?第一次的new(),不是没用了吗?但程序加上后又的确能通过运行,不加又不行?
      

  8.   

    ======上一篇里面有些内容写错了,这里更正一下======
    谢谢 midthinker(呵呵) ,基本解决了。
    不过小弟还有一个问题没搞懂,在singleLinkList(单链表中)
    是这样的,
    ==========================================
    public class singleLinkList {
        
       /**定义单链表的头结点和尾结点*/
      private singleLinkListNode headNode =  new singleLinkListNode();
      private singleLinkListNode tailNode = new singleLinkListNode();     /** Creates a new instance of singleLinkList */
         public singleLinkList() {
           singleLinkListNode headNode = new singleLinkListNode();
           tailNode=headNode;
           printNode(headNode);
           printNode(tailNode);
        }
    ======================================
    为什么headNode被两次new?在运行的时候我输出内容查看链表结点的情况,是这样的:
    /*下面是 singleLinkList(单链表类)构造函数里面输出的headNode 和tailNode的结点情况*/
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为9的结点和 tailNode的结点情况
    singlelinklist.singleLinkListNode@765291 || 1 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【info为9的结点】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【tailNode】*//*下面是添加了结点12后 headNode ,内容为12的结点和 tailNode的结点情况
    singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【tailNode】*//*下面是添加了全部的结点9,12后,整个链表的情况
    singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
    singlelinklist.singleLinkListNode@26e431 || 9 | singlelinklist.singleLinkListNode@14f8dab ==> /*【info为9的结点】*/
    singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】同时也是【tailNode】*/可以看出headNode被两次new,前一次地址是singlelinklist.singleLinkListNode@1ac04e8
                               后一次是singlelinklist.singleLinkListNode@765291 
    为什么需要这样呢?第一次的new(),不是没用了吗?但程序加上后又的确能通过运行,不加又不行?
      

  9.   

    To: yjy001(yjy001)
        呵呵,是啊,确实不需要实例化两次,可能您没有看清我的代码,我把初始化的动作已经转移至构造函数中,在headNode申明时,并未将其初始化。
        所以,这里确实不需要两次实例化。
    @.@||~
      

  10.   

    但是我这样改了之后
    public class singleLinkList {
        
       /**定义单链表的头结点和尾结点*/
      private singleLinkListNode headNode ;
      private singleLinkListNode tailNode  ;     /** Creates a new instance of singleLinkList */
         public singleLinkList() {
           singleLinkListNode headNode = new singleLinkListNode();
           tailNode=headNode;
    ..........................
    }
    运行后,结果象这样
    run:
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> 
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> 
    java.lang.NullPointerException
        at singlelinklist.singleLinkList.ListIsEmpty(singleLinkList.java:28)
        at singlelinklist.singleLinkList.Append(singleLinkList.java:47)
        at singlelinklist.Main.main(Main.java:20)
    Exception in thread "main" 第一条异常at singlelinklist.singleLinkList.ListIsEmpty(singleLinkList.java:28)显示下面【】有错误。
     public boolean ListIsEmpty(){
           【 return headNode.next == null;】       
        }后来,我改成这样,在申明的时候就实例化,
    public class singleLinkList { 
       /**定义单链表的头结点和尾结点*/
      private singleLinkListNode headNode = new singleLinkListNode() ;
      private singleLinkListNode tailNode  ;     /** Creates a new instance of singleLinkList */
         public singleLinkList() {
           tailNode=headNode;
           ..............
        }
    这样就能通过了。
    run:
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> 
    singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 1 | singlelinklist.singleLinkListNode@765291 ==> 
    singlelinklist.singleLinkListNode@765291 || 9 | null ==> 
    singlelinklist.singleLinkListNode@765291 || 9 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 2 | singlelinklist.singleLinkListNode@765291 ==> 
    singlelinklist.singleLinkListNode@26e431 || 12 | null ==> 
    singlelinklist.singleLinkListNode@26e431 || 12 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 2 | singlelinklist.singleLinkListNode@765291 ==> 
    singlelinklist.singleLinkListNode@765291 || 9 | singlelinklist.singleLinkListNode@26e431 ==> 
    singlelinklist.singleLinkListNode@26e431 || 12 | null ==> 我还是没弄明白为什么在实例化的时候,在不同的地方效果不一样,请再给予赐教。很感谢你,帮我解决了问题。马上给分,以后有机会再向你求教。