Java NullPointerException原因知多少

简介: Java NullPointerException原因知多少

有一句古诗云:夜来风雨声,花落知多少,套用一下空指针异常抛出来,原因知多少。


使用Java语言开发应用程序不管是J2SE还是J2EE的,没有几个开发者没经历空指针异常


(NullPointerException)错误的,作为一个runtime Exception最为常见的几种原因是:


1.         对象未初始化而直接引用对象值或者方法到的,代码示例:


package com.fish.codesample;


public class JavaNullSample {


 


   private String name;


   public JavaNullSample() {


   }


   public String getName() {


      return name;


   }


   public static void main(String[] args) {


      new JavaNullSample().getName().length();


   }


}


2.         对象引用已经不存在或者被JDBC关闭


      一个经典的例子是JDBC connection已经关闭,ResultSet对象仍然被使用中,这个时候NullPointerException就被抛出。



3.         违反某些Java容器的限制,读写Null 值


这个方面首推的就java.util.HashTable,它不接受Null 作为Key或者Value,如果试图用Null作为Key去读取HashTable将会得到NullPointerException,代码示例:


Hashtable<String,String> table = new Hashtable<String,String>();


String tKey = null;


// the following codes always throw NullPointerException


tKey = table.get(null);


table.put(tKey, null);


当使用TreeMap/TreeSet的时候,一定确保所有对象的属性的值不为Null,否则在调用get/set方法时候会抛出NullPointerException, 代码示例:


      TreeMap<Person, String> tMap = new TreeMap<Person, String>();


      Person personer1 = new JavaTreeMap(). new Person();


      Person personer2 = new JavaTreeMap(). new Person();


      personer1.setName("fish");


      tMap.put(personer1, "person1");


      tMap.put(personer2, "person2"); // throw NullPointerException




还有几种相对比较难的Java NullPointerException异常


1.         Java Swing/AWT NullPointerException


1)        最常见的错误时忘记初始化某个Swing组件,当调用JFrame.getContentPane().add()方法时导致NullPointerException


2)        当调用JFrame.pack()的时候抛出NullPointerException,最可能的一个原因是JFrame的容器中的Swing组件可能被开发者自己重写而导致不适用pack().


3)        Java JDK6与JDK4的Swing监听机制已经有很大的不同,如果在初始化的时候触发Listener导致执行listener的某些方很可能导致抛出NullPointerException


4)        某些Java2D/Java3D的组件可能导致NullPointerException



2.         Socket连接丢失导致IO流的Java NullPointerException



3.         资源文件加载错误导致的NullPointerException,最常见的代码示例如下:


      InputStream in =this.getClass().getResourceAsStream(PropertiesName);


      props.load(in);  // throw NullPointerException if xml/property files missing



4.         多线程导致的NullPointerException


      这种原因导致的NullPointerException一般很难被发现,特别是在大型和复杂的系统中


而且一段时间内业很难被重现,修复这样的bug成本很高,不修复这样的bug代价很大,意味着用户可能失去对该产品的信任。



后记:Java NullPointerException做为Java Runtime 异常,在开发中减少这样错误的发生就是对代码完成Junit的单元测试,对于一些重要的代码要提高code review的次数从而提高代码质量,增加产品的可靠性。

相关文章
|
6月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
6月前
|
安全 Java 开发者
NullPointerException:拥抱Java Optional-6
NullPointerException:拥抱Java Optional
280 104
|
6月前
|
安全 Java 容器
NullPointerException:拥抱Java Optional-5
NullPointerException:拥抱Java Optional
286 107
|
6月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional-4
告别NullPointerException:拥抱Java Optional-4
252 104
|
5月前
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
11月前
|
存储 Java API
Java Optional 完全指南:彻底告别 NullPointerException
Java 8 引入的 `Optional` 类旨在解决 `null` 带来的空指针异常问题,通过提供容器类显式处理可能为空的值,提升代码健壮性和可读性。本文从基础到进阶解析 `Optional` 的用法,涵盖创建、检查、获取值、处理值等核心功能,结合实际应用场景与最佳实践,助你彻底告别 `NullPointerException`,编写更优雅的 Java 代码。
595 0
|
存储 设计模式 缓存
从一个 NullPointerException 探究 Java 的自动装箱拆箱机制
这行代码一个对象方法都没有调用,怎么会抛出 NullPointerException 呢?
186 9
|
Java
Java“NullPointerException”解决
Java中的“NullPointerException”是常见的运行时异常,发生在尝试使用null对象实例的方法或字段时。解决方法包括:1. 检查变量是否被正确初始化;2. 使用Optional类避免null值;3. 增加空指针检查逻辑。
2408 2
|
Java 容器
Java“NullPointerException”解决
Java中的“NullPointerException”是当程序试图使用一个空对象引用时抛出的异常。解决方法包括:检查变量是否为null、使用Optional类、利用断言和合理初始化变量等。确保代码健壯性,避免运行时错误。
630 0
|
Java
如何优雅的避免Java中:NullPointerException(空指针异常)
如何优雅的避免Java中:NullPointerException(空指针异常)
290 0