JDK1.6 Java.lang.Null.Pointer.Exception
- 先来看一下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的更多相关文章
- java NPE就是空指针异常,null pointer exception
java NPE就是空指针异常,null pointer exception
- java.lang.NoSuchMethodError: main Exception in thread "main"
java.lang.NoSuchMethodError: main Exception in thread "main" 一般是主函数出问题 检查核对一下 public stati ...
- java.lang.NoSuchMethodError: main Exception in thread "main" ===Exception
java.lang.NoSuchMethodError: mainException in thread "main" 出现该异常是因为在之前我的项目中自定义了一个String类, ...
- servlet service() for servlet jsp throws null pointer exception
这么一件小事折腾了一个多小时,google也上不去,对百度我就不吐槽什么了,最后用bing查出了满意的结果.一般程序中不要显式把jsp.jar和servlet.jar放在Lib目录下,因为tomcat ...
- java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
最近在学习RxJava 感觉很happy ,happy的同时遇到不少问题 没办法一点一点来 上张帅图先 在使用RxJava + Retrofit 的时候 有时候接口请求参数不规范 比如 {} @For ...
- 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 ...
- java能不能自己写一个类叫java.lang.System/String正确答案
原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.S ...
- Spring异常解决 java.lang.NullPointerException,配置spring管理hibernate时出错
@Repository public class SysUerCDAO { @Autowired private Hibernate_Credit hibernate_credit; /** * 根据 ...
- Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...
随机推荐
- oracle实用命令入门
登录oracle(需要在oracle用户下) 执行sqlplus,然后输入用户名和密码就可以了,如果是第一次使用oracle的话,可以直接使用sqlplus / as sysdba免密码以管理员的身份 ...
- sudo command
sudo -i : login as sudo password: change the password of current login user exit : logout
- C# to IL 7 Pointers(指针)
Pointers are the heart and soul of a programming language. The only reason why the Cprogramming lang ...
- win10开移动热点让手机使用上网
PC得买个无线网卡带尾部那种的,插后面,有了无线网卡能力了. 然后开启移动热点: 在设备管理器里面去,找到网络适配器,选择带有Wireless的那个,更新驱动,浏览计算机查找,从计算机的设备驱动表选取 ...
- 23 模块 os sys pickle json
一. os模块 主要是针对操作系统的 用于文件操作 二. sys 模块 模块的查找路径 sys.path 三 pickle 模块 1. pickle.dumps(对象) 序列化 ...
- js 数字数组按大小排序
var num = [7,8,6,5,2] //倒序排列 num.sort((a,b)=>{return b-a}) //正序排列 num.sort((a,b)=>{return a-b} ...
- Mysql5.6 for Centos6.5源码编译安装
## 说明 不同服务器需要改变 server_id ,同一台机器上需要改变 port 1. 关闭防火墙[root@mysql ~]# service iptables status --查看防火墙状态 ...
- Elastic Story(一)
关于_all 当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引.例如,当索引这个文档时: { "tweet": ...
- hdu 1693 Eat the Trees——插头DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> # ...
- 深入理解ASP.NET MVC(8)
系列目录 过滤器上下文参数 前一节提到了四种MVC内建过滤器,它们无一例外都在关键的方法中提供了叫filterContext的参数,尽管它们各自类型不同,但是都继承自ControllerContext ...