当前位置: 首页 > news >正文

mysql npe问题_万恶的 NPE 如何避免,几种你必须知道的方案!!!

54b2b4e60895

image.png

前言

空指针异常在开发中可谓是防不胜防,对于这类异常,预防胜于治疗。那么如何能够有效的预防呢?今天陈某来聊一聊如何预防空指针的异常。

什么是空指针?

当一个变量的值为 null 时,在 Java 里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,null 也是对象成员变量的默认值。

所以,一个对象如果没有进行初始化操作,这时候,如果你调用这个对象的方法或者变量,就会出现空指针异常。

如下面示例会发生空指针异常:

Object object = null;

String string = object.toString();

关于异常的分类,什么是运行时异常,什么是编译时异常,这里不再赘述,未了解的朋友可以查阅相关的文章,这个在初级面试中还是比较常问的一类问题。

如何避免空指针异常?

下面说说几个预防空指针的方案。

字符串比较,常量放在前面

对于初级开发者这是个最常见的坑,老司机基本都知道,示例如下:

if(status.equals("success")){

}

上述代码中,如果status为null将会抛出空指针异常,一种避免的方法就是将常量放在前面,如下:

if("success".equals(status)){

}

使用null安全的方法库

作为Java开发者,用的最多的就是Apache的StringUtils,其中的许多方法使用很方便并且不用担心空指针异常,比如StringUtils.isBlank(),isNumeric(),isWhiteSpace()。

初始化默认值

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

User user = new User();

String name = StringUtils.EMPTY;

返回空集合

在返回集合的时候如果是null,统一默认返回一个空集合,如下:

public List getUserList(){

List list = userMapper.gerUserList();

return list == null ? new ArrayList() : list;

}

此时方法调用者将不会担心空指针异常了。

断言

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

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

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

除了Java自带的断言,可以使用一些方便的开源库或者自己实现,具体根据开发要求。

Optional

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

Optional非常强大,想要熟练的使用还是要下一番功夫的,篇幅较大,这里不再细说,想了解的朋友可以查阅相关的文章,这里简单的举个例子,如下:

String version = computer.flatMap(Computer::getSoundcard)

.flatMap(Soundcard::getUSB)

.map(USB::getVersion)

.orElse("UNKNOWN");

避免你的代码中不必要的自动包装和自动解包

不管其他如创建临时对象的缺点,如果wrapper类对象是null,自动包装同样容易导致空指针异常。例如如果person对象没有电话号码的话会返回null,如下代码会因为空指针异常崩溃。

Person ram = new Person("ram");

int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

定义数据库中的字段是否可为空

作为Java开发者,一切的业务都离不开数据库,表中的字段定义不允许为null能够有效的避免代码中的空指针异常。

总结

本篇文章讲了在实际开发中避免空指针的几种切实可行的几种方法,喜欢的朋友们点点在看,欢迎转发,谢谢支持!!!

相关文章:

  • dubbo monitor mysql_dubbox 的各种管理和监管
  • mysql传入Bean_mysql 表映射为java bean 手动生成。
  • mysql数据库程序员_大神程序员养成之路-Mysql数据库基础
  • mac svn客户端_SmartSVN 12 for Mac(SVN客户端)
  • mysql随机数据插入_mysql随机数据生成并插入
  • asp 备份 mysql数据库_用Asp备份与恢复SQL Server 数据库_数据库相关_脚本
  • mysql rds数据库优势_云数据库RDS基础版的优势及适用场景
  • mysql写下拉树_PHP+mysql实现从数据库获取下拉树功能的方法
  • host mysql server_mysql远程连接 Host * is not allowed to connect to this MySQL server
  • python 迭代对象必须实现的方法_关于python的可迭代对象、迭代器、生成器的理解...
  • python上手度_(国内首发)最新python初学者上手练习
  • mysql中引号的作用是什么_mysql单引号和双引号的用法
  • mysql 存储过程 光标_MYSQL 存储过程及游标
  • php封装一个mysql的类_PHP封装的一个单例模式Mysql操作类
  • java 字符串查找_Java-006 Java字符串查找
  • AWS实战 - 利用IAM对S3做访问控制
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • hadoop集群管理系统搭建规划说明
  • Odoo domain写法及运用
  • php的插入排序,通过双层for循环
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 记一次删除Git记录中的大文件的过程
  • 解析 Webpack中import、require、按需加载的执行过程
  • 数据科学 第 3 章 11 字符串处理
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 带你开发类似Pokemon Go的AR游戏
  • 回归生活:清理微信公众号
  • #{}和${}的区别?
  • #每日一题合集#牛客JZ23-JZ33
  • (1)Android开发优化---------UI优化
  • (52)只出现一次的数字III
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (论文阅读40-45)图像描述1
  • (一) storm的集群安装与配置
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET分布式缓存Memcached从入门到实战
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .Net中ListT 泛型转成DataTable、DataSet
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ3757] 苹果树
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [docker] Docker的私有仓库部署——Harbor
  • [FT]chatglm2微调
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  • [Java开发之路](14)反射机制
  • [leetcode 双指针]