A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白磊 中级黑马   /  2013-5-9 22:30  /  2047 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 白磊 于 2013-5-11 09:52 编辑

请问空指针异常一般怎么查找错误,错在哪里了,经常遇到这种错误,可是有些不太懂这个

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
通常是来讲是操作数组的时候才会吧,API给出的资料是:

当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
1、调用 null 对象的实例方法。
2、访问或修改 null 对象的字段。
3、将 null 作为一个数组,获得其长度。
4、将 null 作为一个数组,访问或修改其时间片。
5、将 null 作为 Throwable 值抛出。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘学明    于 2013-5-9 22:42 编辑

1.所谓的指针,就是java中的对象的引用。比如String s;这个s就是指针。
2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针。
3.所谓的空指针异常,就是一个指针是空指针,你还要去操作它,既然它指向的是空对象,它就不能使用这个对象的方法。比如上面的s假如为null,你还要用s的方法,比如s.equals( String x);那么就会产生空指针异常。

空指针异常产生的主要原因如下:
(1) 当一个对象不存在时又调用其方法会产生异常
obj.method() // obj对象不存在时
(2) 当访问或修改一个对象不存在的字段时会产生异常
obj.method()  // method方法不存在时

一般引用数据类型指向了null就是报此错误  指向null以后一定要用此引用进行初始化。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
比如说你定义一个数组。
int[] arr= {1,2,3}
这样的数组运行是不会出现空指针异常的
顶多也就是角标越界。
但你这样定义就会了
int[] arr = new int[0];//因为这个中括号里写的是数组的长度。0长度就是没有长度。哪怕你用arr[0]调用一样出现空指针异常。
假如你数组定义的长度是6,
那么数组的角标排列是:
0,1,2,3,4,5
你数数。正好六个。
因为还有一个是0号角标。数组的角标就是从0号角标开始数的。
只要在调用数组的时候不要定义个6位数的数组还调用6号角标就行了。
因为它的最大角标就是5,还有一个角标是0.
再不懂回复我

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Java 空指针异常(java.lang.NullPointerException),顾名思义,即对象没有进行实例化便进行了使用。实例化的意义,就是将对象实例的地址赋值给对象符号。
  比如 String a = new String();即在堆中将String的实例构造后,将地址赋值给a。 String a = “123”;即将常量池中的“123”这个对象实例的地址赋值给a。
  引发空指针异常,往往是在获取对象实例地址的时候,由于获取的对象实例并不存在,因此返回的地址为null,而又没进行判断,直接使用了该对象实例(地址)引发的。
  例如:
     String userName = request.getParameter("username");
    If (userName.equals("root"))
    {....}
  如果request中并不存在“username”字段,则自然getParameter返回的是null。而调用userName(为null)的equals会抛出异常。

  
  小技巧:如果要把某个方法的返回值与常量做比较,把常量放在前面,可以避免调用null对象的equals方法。例如上述改成: "root".equals(userName);
   因此,我们在进行对象实例地址的获取赋值的时候,在之后,要进行必要的判断。这种情况多发生在,查询数据库、从DTO对象中获取对象等中。
  例如一个数据库查询对象DAO的使用:   List<***> result = DAO.select();    如需在result没有结果的时候进行错误处理,这需要包含两个判断: result为null或者result.size()为0。其业务意义分别是没有表和表中没有记录。即 : if(result == null || result.size() == 0){.......} ,注意,这里的result == null要在result.size() == 0之前才合理。否则会在没有表的时候,即result==null时,抛出空指针异常。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题解决了,请将分类改为“已解决”,谢谢
回复 使用道具 举报
白磊 中级黑马 2013-5-11 08:08:21
7#
黄玉昆 发表于 2013-5-10 22:02
如果问题解决了,请将分类改为“已解决”,谢谢

这个我不会啊   不知道在哪里改呢
回复 使用道具 举报
黄玉昆 黑马帝 2013-5-11 08:23:12
8#
白磊 发表于 2013-5-11 08:08
这个我不会啊   不知道在哪里改呢

你可以看看这个帖子:版主教你玩转论坛
帖子的沙发层,第2点结帖。



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马