• java.lang.NullPointerException


      在java中经常会看到有关空指针异常的错误,并且难以找出这样的错误,索性就总结一下。

        · 产生空指针异常的原因:

             1、字符串变量没有初始化。String str。你对字符串操作就会产生空指针异常。

             2、if(a.equals(null))或者if(a.equals("")),都有可能产生空指针异常。

             3、java类没有实例化。这里的p->null,所以产生了空指针异常。

    class person{
        private String name;
        public person(String name){
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    public class TestNullPointer {
        public static void main(String[] args) {
            person per = null;
            System.out.println(per.getName());
        }
    
    }


    这里插入一个关于链表的NullPointerException。希望能给自己一些警示,能搞更加严谨。

    interface IMyLinkList{
        
        public void clear();//清空
        public int size();
        public boolean isEmpty();
        public boolean add(int value);
        public void add(int index,int value);
        public int get(int index);
        public int set(int index,int value);
        public int remove(int index);
    }
    
    class MyLinkList implements IMyLinkList{
        
        private int TheSize;
        @SuppressWarnings("unused")
        private int modCount=0;
        private Node Begin;
        private Node End;
        
        public MyLinkList(){
            DoClear();
        }
        
                                    private static class Node{
                                        public int data;
                                        public Node prveious;
                                        public Node next;
                                        public Node(int data, Node prveious, Node next) {
                                            super();
                                            this.data = data;
                                            this.prveious = prveious;
                                            this.next = next;
                                        }
                                    }
        
        private void DoClear(){
            Begin = new Node(0, null, null);
            End = new Node(0, Begin, null);
            
            Begin.next=End;
            
            TheSize=0;
            modCount++;
        }
    
        @Override
        public void clear() {
            DoClear();
        }
    
        @Override
        public int size() {
            return TheSize;
        }
    
        @Override
        public boolean isEmpty() {
            return size()==0;
        }
    
        @Override
        public boolean add(int value) {
            add(size(),value);//###############这里有问题
            return true;
        }
    
        @Override
        public void add(int index, int value) {
            addBefore(getNode(index,0,size()),value);//得到index这个节点。在前边插入一个节点
        }
    
        @Override
        public int get(int index) {//得到这个节点的data数据
            return getNode(index).data;
        }
    
        @Override
        public int set(int index, int value) {//设置index节点处的打他数据
            Node p = getNode(index);
            int oldData = p.data;
            p.data = value;
            return oldData;
        }
    
        @Override
        public int remove(int index) {
            return remove(getNode(index));
        }
        
        
        
        //初始化的时候出现了问题、
    
        
        private void addBefore(Node p,int value){//添加一个新节点,只要new一个节点,并且改变节点的前驱和后继
            Node newNode = new Node(value,p.prveious,p);
        
            newNode.prveious.next=newNode;
            p.prveious=newNode;
            
            TheSize++;
            modCount++;
        }
        
        private Node getNode(int index){//得到
            
            return getNode(index,0,size()-1);
        }
        
            //getNode(index,0,size())
            private Node getNode(int index,int lower,int upper){
                Node p = null;
    //抛出异常
                if(index<lower||index>upper){
                    throw new IndexOutOfBoundsException();
                }
                //找到
                if(index<size()/2){
                    p=Begin.next;
                    for(int i=0;i<size()/2;i++){
                        p=p.next;
                    }
                }else{
                  // 但是这么却没有对p进行赋值。产生了空指针异常//p=End.previous 
    for(int i=size();i>index;i--){ p=p.prveious; } } return p; 然后如果判断范围在else中,就GG } private int remove(Node p){ p.next.prveious=p.prveious; p.prveious.next=p.next; TheSize--; modCount++; return p.data; } } public class MyfirstLinkedList { public static void main(String[] args) { IMyLinkList MyLinkedList = new MyLinkList(); System.out.println(MyLinkedList.add(12)); System.out.println(MyLinkedList.size()); } }

     

    入门易,精通难
  • 相关阅读:
    审 讯 技巧
    带参数的多线程的方式
    通达信日线 数据格式
    visual studio 2012 update3
    单实例运行tz
    维特比算法
    Kooboo CMS的安装步骤
    年龄
    富文本编辑器---非常实用的
    printf 打印 unit32_t
  • 原文地址:https://www.cnblogs.com/chenshun-2016/p/5986653.html
Copyright © 2020-2023  润新知