关闭

原来你是这样的NullPointerException

标签: 空指针androidjava
1626人阅读 评论(0) 收藏 举报
分类:

日常开发过程中,最常见的异常莫过于NullPointerException,之前的时候,只是知道去找到报错的位置,然后去解决它,最近有空学习C语言,就去深究了下NullPointerException异常的本质。

发生NullPointerException的情况:

调用 null 对象的实例方法。
访问或修改 null 对象的字段。
如果一个数组为null,试图用属性length获得其长度时。
如果一个数组为null,试图访问或修改其中某个元素时。
在需要抛出一个异常对象,而该对象为 null 时。

首先,我们先找到java.lang.NullPointerException这个类,内容很简单:

package java.lang;

/**
 * Thrown when a program tries to access a field or method of an object or an
 * element of an array when there is no instance or array to use, that is if the
 * object or array points to {@code null}. It also occurs in some other, less
 * obvious circumstances, like a {@code throw e} statement where the {@link
 * Throwable} reference is {@code null}.
 */
public class NullPointerException extends RuntimeException {

    private static final long serialVersionUID = 5162710183389028792L;

    /**
     * Constructs a new {@code NullPointerException} that includes the current
     * stack trace.
     */
    public NullPointerException() {
    }

    /**
     * Constructs a new {@code NullPointerException} with the current stack
     * trace and the specified detail message.
     *
     * @param detailMessage
     *            the detail message for this exception.
     */
    public NullPointerException(String detailMessage) {
        super(detailMessage);
    }

}

NullPointerException翻译过来便是空指针,接下来我们首先要了解的是什么是指针,对于非C/C++的程序员来说,很多其它语言开发者对指针的概念很模糊,说白了,指针就是存储变量的内存地址,在C语言里面,NULL表示该指针不指向任何内存单元,0表示指向地址为0的单元(这个单元一般是不能使用的)。先看一段C语言代码:

void main() {
    int* i = NULL;
    printf("%#x\n", i);
    printf("%#x\n", &i);
    system("pause");
}

null

在C语言里,你可以读取NULL本身的值(void *)0,即0,但是读取它指向的值,那是非法的,会引发段错误。而Java里面的NULL就是直接指向了0,上述也说了,指向地址为0的单元,一般是不能使用的。

一句话总结:因为指向了不可使用的内存单元,虚拟机无法读取它的值,最终导致NullPointerException。

4
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

原来还可以这样,原来还可以这样。原来还可以这样,原来还可以这样,原来还可以这样

http://v.17173.com/playlist_14258026.html http://v.17173.com/playlist_14258247.html http://v.17173...
  • huanyi306
  • huanyi306
  • 2014-03-18 16:39
  • 123

简单并快乐着,带有语法强类型检查的事件总线(EventBus)框架完善篇

在上一篇中提出一个改进的框架,之后小弟花了一点时间进行完善,代码其实很简单(相对于GreenRobot的EventBus来说)。
  • z13759561330
  • z13759561330
  • 2015-10-29 08:45
  • 606

SpringMVC之请求处理源码分析从service到doDispatch之doDispatch分析(二)

说明:本文所用的SpringMVC版本为4.3.4.RELEASE,应用服务器为TomCat8.0.33。 在上一篇文章中我们分析了请求service方法到doDispatch的一部分,今天我们先简...
  • zknxx
  • zknxx
  • 2017-08-12 21:57
  • 385

注解工作原理源码解析

注解工作原理源码解析
  • xiaoshuai1127
  • xiaoshuai1127
  • 2017-07-14 09:23
  • 143

AndroidStudio 依赖 ButterKnife 出现的空指针异常

一 、 出现过程描述        之前一直在ButterKnife 7.x版本,今日将依赖的版本升级为'com.jakewharton:butterknife:8.0.1',结果项目 运行报错,提示...
  • BlueAmerTJ
  • BlueAmerTJ
  • 2016-05-27 15:35
  • 8418

Servlet3.0新特性之异步请求实践

异步处理准许Servlet重新发起一条新线程区调用耗时的业务方法,可以避免等待。 Servlet3.0的异步处理时通过AsyncContext类来处理的,Servlet可以通过ServletRequ...
  • chunxiaqiudong5
  • chunxiaqiudong5
  • 2016-10-17 18:49
  • 552

使用 JUnit 进行 Java 代码的单元测试

下载安装 JUnit 的相关文件 首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成,我这里直接通过开源中国...
  • han_miao
  • han_miao
  • 2013-10-10 11:52
  • 4060

异常机制第三十五课,常见异常分类,异常简单处理

异常分类 jdk中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。 Ex...
  • u013415353
  • u013415353
  • 2015-03-04 14:57
  • 203

随笔之java笔试一

单选题 1、下列语句哪一个正确(B) A.Java程序经编译后会产生machine code B.Java程序经编译后会产生byte code C.Java程序经编译后会产生DLL D.以上都不正确 ...
  • ChineseYoung
  • ChineseYoung
  • 2016-12-12 21:09
  • 270

C#之父——安德斯·海尔斯伯格

比尔盖茨曾高度评价说: “我们为Anders获得这一荣誉感到无比自豪,Anders在C#创建中所做的努力将会改变现在的软件开发方式,并将在以后的十年继续产生影响。” 安德斯·海尔斯伯格(Ander...
  • Forever_six
  • Forever_six
  • 2017-10-18 20:46
  • 200
    个人资料
    • 访问:251908次
    • 积分:2878
    • 等级:
    • 排名:第14267名
    • 原创:44篇
    • 转载:0篇
    • 译文:0篇
    • 评论:321条
    QQ交流群

    Android路上

    611566797
    博客专栏
    我的公众号