Java空指针异常的几种情况_空指针异常的发生条件-程序员宅基地

技术标签: java基础  Java空指针异常的几种情况  

                          Java空指针异常的几种情况

NullPointerException

说法一

NullPointerException由RuntimeException派生出来,是一个运行级别的异常。意思是说可能会在运行的时候才会被抛出,而且需要看这样的运行级别异常是否会导致你的业务逻辑中断。

编程语言中的空指针异常。

1 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:

  • 调用 null 对象的实例方法。

  • 访问或修改 null 对象的字段。

  • 将 null 作为一个数组,获得其长度。

  • 将 null 作为一个数组,访问或修改其时间片。

  • 将 null 作为 Throwable 值抛出。

出现在任何一个位置上的对象引用都有可能为 null,在进行访问,赋值,取值,类型转换等操作时,首先判断该对象是否为 null,否则极易抛出空指针异常; 

2 比如变量为空,而你没有去判断,就直接使用,就会出现NullPointException。写程序时严谨些,尽量避免了,例如在拿该变量与一个值比较时,要么先做好该异常的处理如: if (str == null) {   System.out.println("字符为空!"); } 当然也可以将这个值写在前面进行比较的,例如,判断一个String的实例s是否等于“a”,不要写成s.equals("a"),这样写容易抛出NullPointerException,而写成"a".equals(s)就可以避免这个问题。不过对变量先进行判空后再进行操作比较好

 

 

说法二

1. Calling the instance method of a null object. 
2. Accessing or modifying the field of a null object. 
3. Taking the length of null as if it were an array. 
4. Accessing or modifying the slots of null as if it were an array. 
5. Throwing null as if it were a Throwable value. 

-------------------------
 

1:NullPointerException由RuntimeException派生出来,是一个运行级别的异常。意思是说可能会在运行的时候才会被抛出,而且需要看这样的运行级别异常是否会导致你的业务逻辑中断。
 2:空指针异常发生在对象为空,但是引用这个对象的方法。例如: String s = null; //对象s为空(null) int length = s.length();//发生空指针异常  
 3:一个变量是null,及只有其名,没有实值内容,也没分配内存,当你要去取他的长度,对他进行操作就会出现NullPointException,所以生命一个变量时最好给它分配好内存空间,给予赋值。  
  4:比如变量为空,而你没有去判断,就直接使用,就会出现NullPointException。写程序时严谨些,尽量避免了,例如在拿该变量与一个值比较时,要么先做好该异常的处理如: if (str == null) {   System.out.println("字符为空!"); } 当然也可以将这个值写在前面进行比较的,例如,判断一个String的实例s是否等于“a”,不要写成s.equals("a"),这样写容易抛出NullPointerException,而写成"a".equals(s)就可以避免这个问题。不过对变量先进行判空后再进行操作比较好  
 5:尽量避免返回null,方法的返回值不要定义成为一般的类型,而是用数组。这样如果想要返回null的时候,就返回一个没有元素的数组。就能避免许多不必要的NullPointerException,使用NullObject返回代替返回null确是一种不错的选择。 

 

如何避免空指针?

1、字符串比较,常量放前面

if(status.equals(SUCCESS)){

}
这个时候 status 可能为 null 造成空指针异常,应该把常量放前面,就能避免空指针异常。

if(SUCCESS.equals(status)){

}

2、初始化默认值

在对象初始化的时候给它一个默认值或者默认构造实现,如:

User user = new User();
String name = StringUtils.EMPTY;

3、返回空集合

在返回一个集合的话,默认会是 null,统一规范返回一个空集合。

举个 List 例子,如:

public List getUserList(){
    List list = userMapper.gerUserList();
    return list == null ? new ArrayList() : list;
}
这样接收方就不用担心空指针异常了,也不会影响业务。

4、断言

断言是用来检查程序的安全性的,在使用之前进行检查条件,如果不符合条件就报异常,符合就继续。

Java 中自带的断言关键字:assert,如:

assert name == null : "名称不能为空";
输出:

Exception in thread "main" java.lang.AssertionError: 名称不正确
不过默认是不启动断言检查的,需要要带上 JVM 参数:-enableassertions 才能生效。

Java 中这个用的很少,建议使用 Spring 中的,更强大,更方便好用。

Spring中的用法:

Assert.notNull(name,"名称不能为空");

5、Optional

Optional 是 JDK 8 新增的新特性,再也不用 != null 来判断了,这个在一个对象里面的多个子对象连续判断的时候非常有用。

这里不再详细介绍了,具体看这篇文章:JDK8新特性之Optional

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41563161/article/details/106055044

智能推荐

python request.session get() got an unexpected keyword argument 'cookies'_session.request() got an unexpected keyword argume-程序员宅基地

文章浏览阅读1w次。有问题版本:2.20.0使用命令: pip install -U requests版本升级至:2.22.0问题解决_session.request() got an unexpected keyword argument 'referer

android 模拟器命令 附:模拟器不能联网设置_安卓手机网络限制模拟工具-程序员宅基地

文章浏览阅读9.4k次。1、Android模拟器介绍Android中提供了一个模拟器来模拟ARM核的移动设备。Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目(详见http://bellard.org/qemu/),它可以提供一个虚拟的ARM移动设备。Android模拟器被命名为goldfish,用来模拟包括下面一些功能的ARM SoC:* ARM926ej-S CPU_安卓手机网络限制模拟工具

使用HttpUrlConnection进行post请求上传文件_httputil.formpost-程序员宅基地

文章浏览阅读1k次。使用HttpUrlConnection模拟post表单进行文件上传平时很少使用,比较麻烦。 原理是: 分析文件上传的数据格式,然后根据格式构造相应的发送给服务器的字符串。格式如下:这里的httppost123是我自己构造的字符串,可以是其他任何的字符串----------httppost123 (\r\n)Content-Disposition: form-da_httputil.formpost

识别和匹配idc配置文件_no input device configuration file found for devic-程序员宅基地

文章浏览阅读598次。转自http://blog.csdn.net/coldsnow33/article/details/16808161void EventHub::loadConfigurationLocked(Device* device) { device->configurationFile = getInputDeviceConfigurationFilePathByDeviceIdent_no input device configuration file found for device

.net 修改AD域中的密码-程序员宅基地

文章浏览阅读709次。1.通过vs 2013 新建一个web站点(不是空项目),这个会带一下模板,2.然后新建一个页面UpdatePassWord.aspxaspx页面内容:<%@ Page Title="UpdatePassWord" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup..._asp,net 修改 ad 密码

用 Python 下载抖音无水印视频_python 通过抖音链接下载无水印视频 怎么实现-程序员宅基地

文章浏览阅读346次。说起抖音,大家或多或少应该都接触过,如果大家在上面下载过视频,一定知道我们下载的视频是带有水印的,那么我们有什么方式下载不带水印的视频呢?其实用 Python 就可以做到,下面我们来看一下。很多人学习python,不知道从何学起。很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。很多已经做案例的人,却不知道如何去学习更加高深的知识。那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!QQ群:1097524789首先,我们打开抖.._python 通过抖音链接下载无水印视频 怎么实现

随便推点

(转载)几张图看懂列式存储-程序员宅基地

文章浏览阅读59次。原文地址:http://www.cnblogs.com/bendantuohai/p/4602414.html几张图看懂列式存储目录为什么要按列存储2补充数据压缩3查询执行性能最近看到一篇很好资料,里面三言两语配上几个图就把列式存储(Column-based Storage)讲明白了,牛啊!最喜欢的就是这种浅显易懂就把背景知识讲得..._columnar or column-based

python从入门到实战django_Python Web开发从入门到实战(Django+Bootstrap微课视频版)-程序员宅基地

文章浏览阅读1.5k次。部分基础知识篇章Python Web环境搭建1.1Python Web概述1.1.1Python语言简介1.1.2Python Web的优势1.2安装Python1.3安装开发工具VS Code1.3.1VS Code下载和安装1.3.2VS Code基本配置1.3.3编写和运行Python脚本1.4个Python Web程序1.4.1Django安装1.4.2创建Django项目1.4.3创建应..._pythonweb开发从入门到实战微课视频版

mac下xampp的mysql无法自动启动-程序员宅基地

文章浏览阅读127次。mac下xampp的mysql无法自动启动,每次启动都要手动在终端里执行sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start自动启动解决办法如下:1、打开/Applications/XAMPP/xamppfiles/xampp进行编辑2、找到这一行:$XAMPP_ROOT/bin/mysql.server st..._/opt/lampp/proftpd/scripts/ctl.sh:行 49: 24074 段错误

JS混淆加密工具-程序员宅基地

文章浏览阅读67次。http://www.moralsoft.com/jso-online/hdojso.htm转载于:https://www.cnblogs.com/starweb/archive/2012/05/28/2522817.html_js 混淆加密工具csdn

Qt ------ 截图、获取鼠标指定的RGB值-程序员宅基地

文章浏览阅读1k次。获取RGB值思路:截图,获取图片的(0,0)的RGB值 int x = QCursor::pos().x(); int y = QCursor::pos().y(); // QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId(), x, y, 1, 1);..._qcursor.pos().x()

华为快应用在setInterval中绘制canvas动画卡顿,怎么破_华为快应用怎么能不卡-程序员宅基地

文章浏览阅读1.8k次。现象描述:快应用中通过setinterval周期函数来循环触发canvas绘制代码,在华为手机上绘制的动画会很卡顿,不流畅。问题代码如下:click0() { this.speed = 0.3 let ctx = this.$element('canvas').getContext('2d') setInterval(() => { this.num0 += 2 this.noise = Math.min(0.5, 1) * t_华为快应用怎么能不卡

推荐文章

热门文章

相关标签