• 先来看一下JDK1.6的API:
NullPointerException (Java Platform SE 6)
public class NullPointerException extends RuntimeExceptionnull

当应用程序试图在需要对象的地方使用时,抛出该异常。这种情况包括:

* 调用 null 对象的实例方法。
* 访问或修改 null 对象的字段。
* 将 null 作为一个数组,获得其长度。
* 将 null 作为一个数组,访问或修改其时间片。
* 将 null 作为 Throwable 值抛出。

应用程序应该抛出该类的实例,指示其他对 null 对象的非法使用。

由以上说明可以看出,最主要的原因就是调用的对象是NULL

  • 经常会出现空指针的情况有:
(1)字符比较
String str1 = someclass.getSomeString();
if(str1.equalsIgnoreCase("YES"))
{
//do something
}
else if(str1.equalsIgnoreCase("NO"))
{
//do something else
}
(2)读取配置文件
props.getProperty("somekey");
(3)从MAP取值
map.get("key");
(4)从Session取值
String userName = request.getSession().getAttribute("userName");

等等,这里发生NullPointerException的机会非常大,而且运行情况往往和用户输入的数据有关,所以不容易被发现. 如何避免空指针异常?最主要的是养成一个好的编码习惯,在对对象进行调用方法、比较等等操作时,要判断一下对象有没有可能会是NULL,提前进行处理。

str1.equalsIgnoreCase("YES"); 而应该写成这样:
"YES".equalsIgnoreCase(str1), 这样就可以避免空指针异常。
这两种写法的差异,主要是程序对对象的操作是先判断再执行,就是先判断对象是否存在,然后再去执行其它操作。第一种方式在判断str1的时候,如果str1是null,这是程序肯定会抛出异常,而第二种就OK,不会报异常。
  • 使用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的次数从而提高代码质量,增加产品的可靠性。]

  • 给向往远方的你: 没有比脚更长的路,没有比人更高的山。 --汪国真《山高路远》

如何避免null 值呢, JDK 1.8 中引入了Optional 方法

详情链接

JDK1.6 Java.lang.Null.Pointer.Exception的更多相关文章

  1. java NPE就是空指针异常,null pointer exception

    java NPE就是空指针异常,null pointer exception

  2. java.lang.NoSuchMethodError: main Exception in thread "main"

    java.lang.NoSuchMethodError: main Exception in thread "main" 一般是主函数出问题 检查核对一下 public stati ...

  3. java.lang.NoSuchMethodError: main Exception in thread "main" ===Exception

    java.lang.NoSuchMethodError: mainException in thread "main" 出现该异常是因为在之前我的项目中自定义了一个String类, ...

  4. servlet service() for servlet jsp throws null pointer exception

    这么一件小事折腾了一个多小时,google也上不去,对百度我就不吐槽什么了,最后用bing查出了满意的结果.一般程序中不要显式把jsp.jar和servlet.jar放在Lib目录下,因为tomcat ...

  5. java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.

    最近在学习RxJava 感觉很happy ,happy的同时遇到不少问题 没办法一点一点来 上张帅图先 在使用RxJava + Retrofit 的时候 有时候接口请求参数不规范 比如 {} @For ...

  6. HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException

    HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException type ...

  7. java能不能自己写一个类叫java.lang.System/String正确答案

    原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...

  8. Spring异常解决 java.lang.NullPointerException,配置spring管理hibernate时出错

    @Repository public class SysUerCDAO { @Autowired private Hibernate_Credit hibernate_credit; /** * 根据 ...

  9. Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)

     Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...

随机推荐

  1. 数学 它的内容,方法和意义 第一卷 (A. D. 亚历山大洛夫 著)

    第一章 数学概观 (已看) 1. 数学的特点 2. 算术 3. 几何 4. 算术和几何 5. 初等数学时代 6. 变量的数学 7. 现代数学 8. 数学的本质 9. 数学发展的规律性 第二章 数学分析 ...

  2. 重写( override)and 重载(overload)

    重写override:是子类对父类的允许访问的方法的实现过程的重新编写,名字,返回值和形参都不能改变,即外壳不变,内心更改 重载overload:同一个类里面的方法,名字相同而参数不同,返回值可以相同 ...

  3. COM,SOM, QT, GObject, ObjectiveC

    COM,SOM, QT, GObject, ObjectiveC https://en.wikipedia.org/wiki/IBM_System_Object_Model#Comparison_of ...

  4. [转]kafka详解

    一.入门     1.简介     Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设 ...

  5. JSBridge 知识点

    比较好的介绍文章: Android中JSBridge的原理与实现

  6. centos6 下 yum 升级php5 到 php7

    一 [卸载老版本php] 1.查看老版本 2.卸载老版本 yum remove php* 本人使用一下方式卸载老版本 1)yum -y remove php* #这个命令可以卸载部分,但是清除不干净 ...

  7. Go语言加解密--AES简单实践

    AES加解密的简单实现,代码如下. package main import ( "crypto/aes" "crypto/cipher" "encod ...

  8. Eclipse安装插件的“最好方法”:dropins文件夹的妙用

    在Eclipse3.4以前安装插件非常繁琐. 在Eclipse3.5以后插件安装的功能做了改进.而且非常方便易用. 我们只需要把需要的插件复制(拖放)到eclipse\dropins,然后插件就安装成 ...

  9. 通过IOCTL_ATA_PASS_THROUGH访问ATA设备接口

    控制代码功能:像ATA硬盘发送ATA指令.IDE/ATA:接口,一个串行,一个并行,一般叫做IDE接口的硬盘和ATA接口的硬盘.ATA指令:可以操作ATA硬盘的指令. typedef struct _ ...

  10. 用shell脚本生成日志文件

    mdate=`date +%R-%d-%m-%Y` LogFile=/root/HDstatusLog.log echo disk is good! $mdate >> $LogFile ...