首先要指明的是Java的空指针异常是指当你试图调用一个为null的对象的方法或者访问字段时JVM抛出空指针异常。null是一个特殊值表示引用不指向任何对象。但它本身不是对象不是任何对象的实例。null可以赋值给任意引用类型但它不属于任何类型null instanceof 任何类 都是false。成员引用变量默认是null。String s null; List? list null; Object o null;除了8种基本类型如int、boolean等其余类型均为引用类型如String、ArrayList等。void类型除外它既不是基本类型也不是引用类型。它只是一个关键字专门标记方法无返回值。基本类型的特点是存真实数值、不可能为null、直接放在栈里。引用类型的特点是存地址引用、可以为null、真实对象在堆里变量只存一个指向它的地址。int a 10; //基本类型a里面就是10 String s abc; //引用类型s里存的是地址 Person p new Person(); //引用类型为什么叫引用因为它不直接跑数据而是指向引用堆里的一个对象。打个比方基本类型就像你手里拿着钱而引用类型相当于你拿着一张银行卡。卡本身不是钱钱在银行卡卡号指向的那个账户里面放着。弄清楚以上的内容后我们再来谈谈造成空指针异常的常见原因。1.对象没new直接用User user; user.getName(); //user为null2.方法返回了null你没判断就调用String name user.getName(); name.trim(); //如果getName()返回null就会异常3.集合或者数组为null不是空集合ListString list null; list.size(); //空指针报错null和空集合完全不是一个概念。集合或者数组为null表示根本没有这个集合或者数组。上方的代码中变量list里是null代表内存里没有创建集合对象。空集合是指内存里创建了这个集合但里面没有东西。集合对象真实存在但里面元素个数为零。可以安全调用。打个比方null就像你根本没有钱包你想数钱、放钱根本无法实现。空集合相当于你有一个钱包但里面没有钱。可以数钱数出来结果为0可以放钱。4.包装类拆箱Integer a null; //包装类可以是null int b a; //自动拆箱空指针Java有8个基本类型它们不是对象不能赋值为null。所以Java给每个基本类型都做了个包装类变成引用类型。包装类的诞生不仅仅是这一个原因这里就不细说了。除了int -- Integer、char -- Character之外其他基本类型的包装类只需要将首字母大写即可。以上的代码JVM实际执行的是:int b a.intValue();但 a 是null调用 null.intValue() 就会发生空指针异常。5.级联调用user.getAddress().getCity(); //user/getAddress()任意一个为null都会报错6.字符串比较写反str.equals(abc); //str为null就会报错知道异常的原因后以下的规避方法就更容易理解了。1.初始化对象private User user new User();2.调用前判空最基础if(user ! null){ String name user.getName(); }3.字符串比较用常量在前abc.equals(str); //永远不会空指针4.返回空集合不要返回null//坏 public ListString getList(){ return null; } //好 public ListString getList(){ return new ArrayList(); }5.级联调用逐层判空if(user ! null user.getAddress() ! null){ String city user.getAdress().getCity(); }6.三目运算符兜底String name (user ! null) ? user.getName() : 未知总结空指针异常你对null调用了方法或者字段。规避方法调用前判空、不返回nul、用Optional或常量在前。