java空指针异常:java.lang.NullPointException

一.什么是java空指针异常java

    咱们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,咱们不在这里讨论叫指针究竟合不合适,而只是针对这个异常自己进行分析。空指针就是空引用,java空指针异常就是引用自己为空,却调用了方法,这个时候就会出现空指针异常。能够理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,而后经过对象去调用这些成员变量和方法。对于空指针来讲,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,固然会出现空指针异常。程序员

 1 public class Test {
 2     private int a=1;
 3     private int b=2;
 4     public static void main(String[] args) {
 5         // TODO Auto-generated method stub
 6         Test t1 = new Test();
 7         Test t2 = null;
 8         System.out.println(t1.a);
 9         System.out.println(t2.a);
10         System.out.println(t2.c());
11     }
12     public String c(){
13         return "123";
14     }
15 }

咱们分析上面这段示例代码,在Test类中,有两个成员变量a和b,和一个方法c()。而后在main()方法中,咱们建立了两个对象t1和t2,其中t1指向经过构造方法实例出的Test对象,而t2只是声明,并指向了空,并无指向实际的对象。调试的时候,第一条输出语句是能够经过编译的,而执行到第二条输出语句的时候,因为空指针调用了不属于它的a,程序终止,报告空指针异常。一样,注释第二条输出语句,程序在执行到第三条输出语句的时候,因为调用了不属于它的c()方法,会出现同样的错误。服务器

 

二.如何解决session

    对于每个java程序员来讲,几乎都避免不了遇到空指针异常,特别是经验不足的初学者。并且因为它的调试和查找相对其它异常来讲比较困难,经常须要花费很大的精力去解决它。eclipse

    首先认识一下java中的nullspa

    null是Java中一个很重要的概念。null设计初衷是为了表示一些缺失的东西,例如缺失的用户、资源或其余东西。可是,一年后,使人头疼的空指针异常给Java程序员带来很多的骚扰。设计

    null是java中的关键字,所以,它不能写成NULL,Null,只能是null。指针

    null是全部引用类型的默认值,若是没有让一个引用指向一个实际存在的对象,它的默认值就是null。null本质上是一个值,这跟int的默认值是0,boolean的默认值是false同样。如今,咱们一般都使用像eclipse等的集成开发环境进行开发,通常在定义变量的时候都会进行初始化(这也是写代码的一个良好的习惯),若是没有进行初始化,系统会进行提示。调试

报空指针异常的缘由有如下几种: code

1字符串变量未初始化; 2接口类型的对象没有用具体的类初始化,好比: List it;会报错 List it = new ArrayList();则不会报错了 3当一个对象的值为空时,你没有判断为空的状况。你能够试着把下面的代码前加一行代码: if(rb!=null && rb!="") 改为: if(rb==null); if(rb!==null&&rb!="") 或者if("").equals(rb)) 空指针的解决办法:        重点关注报错发生的所在行,经过空指针异常产生的两条主要缘由诊断具体的错误。同时为了不空指针的发生,最好在作判断处理时将“null”或者空值放于 设定的值以前。 常见空指针异常的简要分析: (1)空指针错误     Java中的8种基本数据类型,变量的值能够有其默认值,加入没有对其正常赋值,java虚拟机是不能 正确编译经过的,所以使用基本的Java数据类型通常是不会引发空指针异常的。实际开发中,大多数的空指针异常主要与对象的操做相关。     下面列出可能发生空指针异常的几种状况及相应解决方案:     代码段1:   out.println(request.getParameter("username"));   分析:代码段1的功能十分简单,就是输出用户输入"username"的值。        说明:看上去,上面的语句找不出什么语法错误,并且在大多数状况下也遇不到什么问题。可是,若是某个用户在输入数据时并无提供表单 域"username" 的值,或经过某种途径绕过表单直接输入时,此request.getParameter("username")的值为空(注意不是空字符串,是空对象 null。),out对象的println方法是没法直接对空对象操做的,所以代码段1所在的JSP页面将会抛出 "Java.lang.NullPointerException"异常。并且即便对象可能为空时,也调用Java.lang.Object或 Object对象自己的一些方法如toString(), equal(Object obj)等操做。     代码段2:   String userName = request.getParameter("username");   If (userName.equals("root"))   {....}   分析:代码段2的功能是检测用户提供的用户名,若是是用户名称为"root"的用户时,就执行一些特别的操做。                                                                              说明:在代码段2中,若是有用户没有提供表单域"username"的值时,字符串对象userName为null值,不可以将一个null的对象与另外一 个对象直接比较,一样,代码段2所在的JSP页面就会抛空指针错误。      一个小技巧:若是要把某个方法的返回值与常量作比较,把常量放在前面,能够避免调用null对象的equals方法。譬如:      If ("root".equals(userName))   {....}     即便userName对象返回了null对象,这里也不会有空指针异常,能够照常运转。     代码段3:   String userName = session.getAttribute("session.username").toString();         分析:代码段3的功能是将session中session.username的值取出,并将该值赋给字符串对象userName。        说明:在通常状况下,若是在用户已经进行某个会话,则不会出现什么问题;可是,若是此时应用服务器从新启动,而用户尚未从新登陆,(也多是用户关闭浏 览器,可是仍打开原来的页面。)那么,此时该session的值就会失效,同时致使session中的session.username的值为空。对一个 为 null的对象的直接执行toString()操做,就会致使系统抛出空指针异常。     代码段4: public static void main(String args[]){        Person p=null;        p.setName("张三");        System.out.println(p.getName()); } 分析:声明一个Person对象,并打印出该对象的中的Name名字。 说明:这个时候你的p就出现空指针异常,由于你只是声明了这个Person类型的对象并无建立对象,因此它的堆里面没有地址引用,切忌你要用对 象掉用方法的时候必定要建立对象。

相关文章
相关标签/搜索