`
银辰宇
  • 浏览: 4352 次
文章分类
社区版块
存档分类
最新评论

什么是空指针异常,以及它们的原因是什么?

阅读更多
声明引用变量(即对象)时,实际上是在创建指向对象的指针。 请考虑以下代码,其中声明基本类型int的变量:

int x; x = 10;
在此示例中,变量x是一个int ,Java会将它初始化为0。 当您在第二行中将其分配给10时,您的值10将被写入x指向的内存位置。

但是,当您尝试声明引用类型时会发生不同的事情。 请使用以下代码:

Integer num; num = new Integer(10);
第一行声明一个名为num的变量,但它不包含原始值。 相反,它包含一个指针(因为类型是Integer ,它是一个引用类型)。 既然你还没有说什么指向Java,它将它设置为null,意思是“ 我指着什么都没有 ”。

在第二行中, new关键字用于实例化(或创建)Integer类型的对象,并为指针变量num分配此对象。 您现在可以使用解除引用运算符引用该对象. (一个点)。

您询问的Exception在声明变量但未创建对象时发生。 如果尝试取消引用num BEFORE在创建对象之前会出现NullPointerException 。 在最琐碎的情况下,编译器将捕获问题并让您知道“num可能尚未初始化”,但有时您编写的代码不会直接创建对象。

例如,您可能有如下方法:

public void doSomething(SomeObject obj) { //do something to obj }
在这种情况下,您不是在创建对象obj ,而是假设它是在调用doSomething方法之前创建的。 不幸的是,可以像这样调用方法:

doSomething(null);
在这种情况下, obj为null。 如果该方法旨在对传入的对象执行某些操作,则抛出NullPointerException是合适的,因为它是程序员错误,并且程序员将需要该信息用于调试目的。

或者,可能存在这样的情况:该方法的目的不仅仅是对传入的对象进行操作,因此可以接受空参数。 在这种情况下,您需要检查null参数并采取不同的行为。 您还应该在文档中解释这一点。 例如, doSomething可以写成:

/** * @param obj An optional foo for ____. May be null, in which case * the result will be ____. */ public void doSomething(SomeObject obj) { if(obj != null) { //do something } else { //do something else } }
分享到:
评论

相关推荐

    Sqoop空指针异常需要的jar包.rar

    Sqoop从MySQL导数据到HDFS上,如果报错空指针异常,需要的jar包。正常情况只要安装java-json.jar就可以。如果不行就都安装上。如果你用的是阿里云的EMR,安装完之后还报错的话,需求确认你的jar包中是否含有hive开头...

    你必须知道的495个C语言问题

    5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有机器用非零空指针吗,或者不同类型用...

    《你必须知道的495个C语言问题》

    5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的,真有机器用非零空指针吗,或者不同...

    C 语言编程常见问题解答.chm

    7.24 为什么不能给空指针赋值?什么是总线错误、内存错误和内存信息转储? 7.25 怎样确定一块已分配的内存的大小? 7.26 free()函数是怎样知道要释放的内存块的大小的? 7.27 可以对void指针进行算术运算吗? ...

    C语言编程要点

    7.24. 为什么不能给空指针赋值?什么是总线错误、内存错误和内存信息转储? 126 7.25. 怎样确定一块已分配的内存的大小? 126 7.26. free()函数是怎样知道要释放的内存块的大小的? 126 7.27. 可以对void指针进行算术...

    C语言FAQ 常见问题列表

    o 6.15 运行时的 ``空指针赋值" 错误是什么意思? * 7. 数组和指针 o 7.1 我在一个源文件中定义了 char a[6], 在另一个中声明了 extern char *a 。为什么不行 ? o 7.2 可是我听说 char a[ ] 和 char *a 是...

    Java程序设计与数据结构第七章习题答案

    为学习Java程序设计的基础同学提供习题代码的参考,便于他们掌握多种方法,得到解决问题的思路和想法,Java程序设计与数据结构第七章习题答案!!!

    你必须知道的495个C语言问题(PDF)

    老资源。 目录 1 声明和初始化1 1.1 我如何决定使用那种整数类型? . . . ....1.2 64 位机上的64 位...5.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地 出现? . . . . . . . . . . . . . . . . . . . ...

    Paguro:JVM的通用,空安全,不可变的集合和功能转换

    原始对象与装箱的对象(不要使用原始对象-泛型仍然无法处理它们) 在lambdas中检查异常(Paguro毫无保留地接受它们) 空指针异常Kotlin也几乎解决了所有这些问题,但是如果您陷于Java,Paguro是一个不错的解决方案。...

    Rust的概要介绍与分析

    作为Mozilla研究项目的一个成果,Rust自诞生以来,就致力于解决C和C++这类底层语言中常见的安全问题,如空指针异常、缓冲区溢出等,同时保持了它们的运行效率。以下是关于Rust语言的综合资源概览,旨在为初学者到...

    函数、内存、一维数组、二维数组

    函数的定义 什么是函数? •函数就是定义在类中的具有特定功能的一段... 空指针异常(NullPointerException) int[] arr = null; System.out.println(arr[0]); arr引用没有指向实体,却在操作实体中的元素时。

    Android Crash 治理之道

    Crash知道: Crash是指由于未处理的异常或者信号导致的意外退出,使得Android应用崩溃。当应用崩溃时,Android会杀...比如一些常见异常没有捕获处理,通常在android应用开发中NullPointerException(空指针异常)是最常

    golang nil接口和空接口

    前言 接口: 接口类型 是由一组方法签名定义的集合。 接口类型的变量可以保存任何实现了这些方法的值。 类型通过实现一个接口的所有方法来...在一些语言中,这会触发一个空指针异常,但在 Go 中通常会写一些方法来优雅

    Infer:用于Java,C,C ++和Objective-C的静态分析器-开源

    推断检查Android和Java代码中的空指针异常,资源泄漏,注释可达性,缺少锁保护以及并发竞争条件。 推断检查是否有空指针解除引用,内存泄漏,编码约定和不可用的API。 从“入门指南”和我们的其他文档开始下载并...

    Databinding使用、Databinding原理、Androidx集成Databinding、Databinding源码分析、Databinding双向绑定原理

    简介 Databinding是谷歌的一个官方支持库,它...这也可以提高应用程序的性能,并有助于防止内存泄漏和空指针异常。 Androidx集成Databinding 1、将dataBinding元素添加到 build.gradle应用程序模块中 android { ......

    华为编程开发规范与案例

    其中红色部分巧妙的利用指向指针的指针为指针puc_card_config_tab赋值,而在兰色部分使用该指针。但在Get_Config_Table函数中有可能失败返回而不给该指针赋值。因此,以后使用的可能是一个非法指针。 指针的使用是...

    操作系统(内存管理)

    如果没有足够的可用内存,那么它返回一个空指针。 free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存...

    java8stream源码-Java8Practice:与Java8特性相关的示例

    java8流源码Java8 特性 1.界面增强- 代码链接[] 默认方法: ...处理空指针异常并避免空检查导致代码整洁的更好方法。 它是一个值的包装对象(可能是也可能不是 null)。 Optional str2 = Optional.ofN

Global site tag (gtag.js) - Google Analytics