java空指针类型及解决方法

java 空指针异常(java.lang.NullPointerException)

发布时间: 2011-02-16 09:14    来源: qinzai.javaeye.com

摘自:http://www.eifr.com/article.php?id=1370

在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException)。空指针异常绝对 是Java中最难查找和调试的一种异常,你永远无法得到任何有用的调试信息。通过个人日常总结和网上搜集整理,归纳如下,供大家参考。空指针异常产生的主 要原因如下:所以在Java中一般报空指针异常的原因有以下几种:
1字符串变量未初始化;
2接口类型的对象没有用具体的类初始化,比如:
List lt;会报错
List lt = 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类型的对象并没有创建对象,所以它的堆里面没有地址引用,切忌你要用对 象掉用方法的时候一定要创建对象。

时间: 2024-11-05 21:46:52

java空指针类型及解决方法的相关文章

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class异常解决方法

package com.wzs; import java.lang.reflect.ParameterizedType; public class T1<T> {     private Class classt;     public T1() {         ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();         this.classt = (Class)

Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

java.lang.OutOfMemoryError: Java heap space 的解决方法 关键字: tomcat outofmemoryerror permgen space java heap space 最近在熟悉一个开发了有几年的项目,需要把数据库从mysql移植到oracle,首先把jdbc的连接指向mysql,打包放到tomcat里面,可以跑起来,没有问题,可是当把jdbc连接指向oracle的时候,tomcat就连续抛java.lang.OutOfMemoryError的错

Eclipse启动时提示Fail to create the Java Virtual Machine的解决方法

这个错误是Eclipse里面的一个bug,我们通过如下的设置就可以解决它. 打开eclipse安装目录下的eclipse.ini文件: 将其中的256m改为128m,512m改为256m,1024m改为512m即可. 修改后的文件内容如下: -startupplugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32

基于Java内存溢出的解决方法详解

一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间.如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context

(转)Android工程出现 java.lang.NoClassDefFoundError错误解决方法

在Eclipse中,导入Android工程,工程没有报错,运行时,出现 java.lang.NoClassDefFoundError类没有找到的错误.从问题上可以看出是导入包出错的原因.遂百度加谷歌. 问题出在:ADT高版本的原因 把引入的第三方包放在Referenced Libraries中,ADT升级到17后就出现了Android Dependencies,所以如果程序中引入的第三方包没有在Android Dependencies中时,就会报文章开头的错. 解决方法: 先移除之前的Refer

访问jsp报HTTP Status 500 - java.lang.NullPointerException的解决方法

当用Eclipse开发web时,因为没有servlet和jsp的jar包,无法顺利的进行开发工作,而当把jar包放入webapps的lib目录中后,项目中的servlet和jsp的jar包会和tomcat中的jsp和servlet包冲突,会造成访问任何的jsp页面,都会报"HTTP Status 500 - java.lang.NullPointerException"的错误 解决方法:在maven的web项目中(或者通过Eclipse建立的web project),不要在pom文件中

找到多个与名为“Home”的控制器匹配的类型。解决方法

“/”应用程序中的服务器错误. 找到多个与名为“Home”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配的控制器,则会发生这种情况.如果是这样,请通过调用带有 'namespaces' 参数的 "MapRoute" 方法的重载来注册此路由. “Home”请求找到下列匹配的控制器:WebAppAreasDemo.Controllers.HomeControllerWebAppAreasDemo

java.lang.OutOfMemoryError:Java heap space的解决方法

出现这种报错的原因:JAVA的堆栈设置太小. 解决方法:设置JVM参数,让java程序在运行的时候,可以拥有更多的堆栈内存. 如下: 在VM arguments中设置VM参数,也就是允许的堆栈内存大小为:-Xms1024m -Xmx1024m. 默认为64M,太小了,一些大的程序无法运行,我们这里设置为1024M,程序就可以顺利运行了.

java.lang.NullPointerException at org.apache.jsp.**_jsp.jspInit(**_jsp.java)tomcat启动异常解决方法

今天遇到的其他一个问题就是,启动tomcat时,报:java.lang.NullPointerException at org.apache.jsp.**_jsp.jspInit(index_jsp.java)异常,因为我刚刚配置服务器,以为JSP页面出现了问题,不过写了一个空的JSP页面依旧是,后来才知道,jar包冲突导致的,我在tomcat的lib目录下放了jsp-api.jar的jar包,而项目中最初也一直有一个这个jar包,方法产生了冲突.解决办法就是删除掉项目里WEB-INF/lib下