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 ...
随机推荐
- spark aggregate函数详解
aggregate算是spark中比较常用的一个函数,理解起来会比较费劲一些,现在通过几个详细的例子带大家来着重理解一下aggregate的用法. 1.先看看aggregate的函数签名在spark的 ...
- 诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别
前言:早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo "" > show_web-error.log或者> show_web-debug.l ...
- day 56 jQuery学习
1.补充:each 描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组.数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1.其他对象通过其属性名 ...
- Visual Studio不显示智能提示代码,快捷键Alt+→也不出现
最近安装了Dev Express的控件,我的vs2017 Enterprise版的环境,智能提示补全代码的快捷键功能,好像被修改了,不能使用了. 我原来的时候,比如在代码中输入如下代码: Consol ...
- Airtest Project的探索和使用
Airtest使用参考博文: https://testerhome.com/topics/12391 1. 安装Python 3 2. 安装pip: 安装方法参考另外一篇随笔 pip3部署: C:\U ...
- openstack--4--控制节点安装配置glance
Glance相关介绍 image Service 的功能是管理 Image,让用户能够发现.获取和保存 Image.在 OpenStack 中,提供 Image Service 的是 Glance,其 ...
- 代理模式proxy
代理模式的共同优点如下: (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度. (2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵 ...
- linux shell创建目录、遍历子目录
1.创建目录 代码1: #!/bin/bash#如果没有tmp_dir目录则创建static_dir="/web/fyunw.com/static"if [ ! -d $staic ...
- [转]关于ImportError: xxxx.so: undefined symbol: PyFPE_jbuf的解决方案
转自: http://blog.csdn.net/zixiximm/article/details/50505921 最近在学着用caffe,总是遇到各种各样奇怪的问题.有时候搜遍整个google也找 ...
- C/C++中带可变参数的函数
1.带可变参数的函数由来 当函数中的参数个数不确定时,这时候就需要带可变参数的函数! 如我们经常使用的C库函数printf()实际就是一个可变参数的函数, 其原型为: int printf( cons ...