什么是空指针异常

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

日常开发过程中,最常见的异常莫过于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);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

void main() {
    int* i = NULL;
    printf("%#x\n", i);
    printf("%#x\n", &i);
    system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

null

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

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

http://blog.csdn.net/pangpang123654/article/details/52370669

目录
相关文章
|
3月前
|
Kubernetes 关系型数据库 MySQL
seata启动问题之指针异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
65 0
项目中常见NPE空指针异常
项目中常见NPE空指针异常
|
2月前
|
安全 IDE Java
终结空指针异常:Java开发者的生存指南
终结空指针异常:Java开发者的生存指南
57 1
|
2月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
45 1
|
4月前
|
Java
又是把Java基础知识学废的一天,new 一个对象数组,操作时报空指针异常
又是把Java基础知识学废的一天,new 一个对象数组,操作时报空指针异常
36 0
|
4月前
|
存储 缓存 NoSQL
SpringBoot整合Redis调用lua脚本出现空指针异常(序列化器问题)
一、问题描述 业务中出现需要保证原子性的一系列缓存操作,所以决定使用lua脚本来保证原子性。 但是调用过程中lua脚本抛出了异常:attempt to perform arithmetic on local ‘xxx’ (a nil value) 发生异常的lua脚本代码(部分)
|
4月前
|
Java Spring
SpringMVC控制层private方法中出现注入的service对象空指针异常
一、现象 SpringMVC中controller里的private接口中注入的service层的bean为null,而同一个controller中访问修饰符为public和protected的方法不会出现这样的问题。 controller中的方法被AOP进行了代理,普通Controller如果没有AOP,private方法中bean也是正常的。
|
7月前
|
存储 Java 开发者
使用Optional优雅避免空指针异常
在编程世界中, 空指针异常(NullPointerException) 无疑是我们最常遇到的"罪魁祸首"之一。它像一片隐蔽的地雷,静静地等待着我们不小心地踏入,给我们的代码带来潜在的威胁。这种问题虽然看似微小,但却无法忽视。甚至可能对整个程序的稳定性产生重大影响。
33 0
|
8月前
|
Java
如何优雅的避免Java中:NullPointerException(空指针异常)
如何优雅的避免Java中:NullPointerException(空指针异常)
65 0
|
8月前
|
Java 容器
JavaMailSender发送邮件(整合SpringBoot、解决空指针异常问题)
一、邮箱开启SMTP服务 以qq邮箱为例 进入邮箱设置页面后选择账户