java避免空指针异常_避免Java中的空指针异常

java避免空指针异常

空指针异常是Java中最常见,最烦人的异常。 在这篇文章中,我想避免这种不希望的异常。

首先让我们创建引发空指针异常的示例

private Boolean isFinished(String status) {  if (status.equalsIgnoreCase("Finish")) {  return Boolean.TRUE;  } else {  return Boolean.FALSE;  }  }

在以前的方法中,如果我们将“ status”变量的值传递为null,则会在下一行引发Null Pointer Exception

if (status.equalsIgnoreCase("Finish")) {

所以我们应该将我的代码更改为以下代码,以避免Null Pointer Exception

private Boolean isFinished(String status) {if ("Finish".equalsIgnoreCase(status)) {return Boolean.TRUE;} else {return Boolean.FALSE;}}

在以前的方法中,如果将“ status”变量的值设置为null,则不会引发Null Pointer Exception。

如果您有object.equals(“ literal”) ,则应替换为“ literal” .equals(object)

如果您有object.equals(Enum.enumElement) ,则应替换为

Enum.enumElement.equals(object)。

通常,您可以确保对象没有等于null值的对象的equals方法。

我将继续提供更多最佳实践和建议。

在第1部分的帖子中,我列出了如何在equalsIgnoreCase()方法和枚举器中避免NPE 今天我将写以下案例
1-空集合
2-使用一些方法 3-断言关键字 4-断言类 5-异常处理 6-点语法太多 7- StringUtils类

1-空集合

空集合是没有任何元素的集合。 一些开发人员返回的Collection的空值不包含任何元素,但是为false,您应该返回Collections.EMPTY_LIST,Collections.EMPTY_SETCollections.EMPTY_MAP。

错误代码

public static List getEmployees() {  List list = null;  return list;  }

正确的代码

public static List getEmployees() {  List list = Collections.EMPTY_LIST;  return list;  }

2-使用一些方法

使用一些方法来确保不存在空值,例如contains(),indexOf(),isEmpty(),containsKey(),containsValue()hasNext()。

String myName = "Mahmoud A. El-Sayed";  List list = Collections.EMPTY_LIST;  boolean exist = list.contains(myName);  int index = list.indexOf(myName);  boolean isEmpty =list.isEmpty();  Map map =Collections.EMPTY_MAP;  exist=map.containsKey(myName);  exist=map.containsValue(myName);  isEmpty=map.isEmpty();  Set set=Collections.EMPTY_SET;  exist=set.contains(myName);  isEmpty=set.isEmpty();  Iterator iterator;  exist = iterator.hasNext();

3-断言关键字

assert是Java 1.4中提供的关键字,它使您能够测试关于代码的假设。

assert关键字的语法

assert expression1 ;

expression1是被评估的布尔表达式,如果为false,则系统将抛出AssertionError而没有详细消息

assert expression1 : expression2 ;

expression1是被评估的布尔表达式,如果为false,系统将抛出AssertionError并且详细消息为expression2

例如,在我的帖子中,我想断言表达式不为空,那么我应该在下面的代码中编写

public static String getManager(String employeeId) {  assert (employeeId != null) : "employeeId must be not null";  return "Mahmoud A. El-Sayed";  }

如果我尝试使用getManager(null)调用getManager方法
它将引发“ java.lang.AssertionError:employeeId不能为空”

在运行代码以启用断言时,请注意在java选项中使用-enableassertion

4-断言类

断言类存在于com.bea.core.repackaged.springframework.util包中,并且有很多断言中使用的方法。

public static String getManager(String employeeId) {  Assert.notNull(employeeId, "employeeId must be not null");  Assert.hasLength(employeeId, "employeeId must has length greater than 0");  return "Mahmoud A. El-Sayed";  }

如果我尝试使用getManager(null)调用getManager方法
它将引发“ java.lang.IllegalArgumentException:employeeId必须不为null”

5-异常处理

我应该小心使用try catch语句或检查变量的空值进行异常处理
例如

public static String getManager(String employeeId) {  return null;  }

我将使用以下代码进行校准

String managerId = getManager("A015");  System.out.println(managerId.toString());

它将引发“ java.lang.NullPointerException” ,因此要处理此异常,我应使用try catch或检查空值

尝试catch语句

我将调用代码更改为以下代码

String managerId = getManager("A015");  try {  System.out.println(managerId.toString());  } catch (NullPointerException npe) {  //write your code here  }

b-空值检查

我将调用代码更改为以下代码

String managerId = getManager("A015");  if (managerId != null) {  System.out.println(managerId.toString());  } else {  //write your code here  }

6-点语法太多

一些开发人员使用这种方法,因为他编写的代码更少,但是将来维护和处理异常不会更容易

错误代码

String attrValue = (String)findViewObject("VO_NAME").getCurrentRow().getAttribute("Attribute_NAME");

正确的代码

ViewObject vo = findViewObject("VO_NAME");  Row row = vo.getCurrentRow();  String attrValue = (String)row.getAttribute("Attribute_NAME");

7- StringUtils类

StringUtils类是org.apache.commons.lang包的一部分,我可以使用它来避免NPE,特别是其所有方法都是null安全的

例如StringUtils。 IsEmpty(), StringUtils。 IsBlank(), StringUtils.equals() 等。
您可以从这里阅读此类的规范

结束语编写代码时,请始终注意NullPointerException ,并猜测如何将其抛出到代码中,并在代码中编写// TODO以便以后没有更多时间解决它。

参考: 避免空指针异常的第1部分 , 避免空指针异常的第2部分,来自我们的JCG合作伙伴 Mahmoud A. ElSay 在Oracle Dive博客中发表。


翻译自: https://www.javacodegeeks.com/2012/06/avoid-null-pointer-exception-in-java.html

java避免空指针异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比java好的_Java Spring真的比直接进行Java编程好吗

我已经读过依赖注入对于测试是有好处的,因为可以在没有依赖的情况下测试一个类,但是我想到的问题是,如果A类依赖于B或C或任何类,则独立于某个类的A类测试就是得出的测试结果为零,而不是失败或过去的测试.创建A类是为了执行某些操作,如果无论是使用新关键字还是在Spring中设置多…

SurfaceFlinger与Surface概述

基本原理: SF一个Client对应一个app中的SurfaceComposerClient, 分别是Binder的n端和b端,主要用来CreateSurface 一个app中有多个Activity,一个Activity一般有一个Surface(除SurfaceView,一个View就有一个Surface)&…

拼图项目动手指南

Jigsaw项目将把模块化引入Java平台,根据原始计划,它将在12月10日完成功能。 所以我们在这里,但是拼图在哪里? 在过去的六个月中肯定发生了很多事情: 原型问世 ,内部API的迫在眉睫的删除引起了很大的骚动 &…

java实现回文验证_LeetCode 精选 TOP 面试题(Java 实现)—— 验证回文串

文章目录一、题目描述1.1 题目验证回文串给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a cana…

Yarn 和 Npm 命令行切换 摘录

原文作者: Gant Laborde原文地址: https://shift.infinite.red/np...中文翻译: 文蔺译文地址:http://www.wemlion.com/2016/n... 好,想必你对新的 JavaScript 包管理工具 yarn 已经有所耳闻,并已通过 npm i -g yarn 进行了安装,现在想知道怎么…

Something about Giraffe (II)

先解決老師留的幾個問題再說吧,23333 XD.Giraffe 是一個將 Deep Reinforcement Learning 和 Neural Network 结合到一起的Chess AI 程式。 作者 Matthew Lai 是一個了不起的人,目前就職於 Google Deepmind. 隨著AlphaGo席捲全球,隨著Deep lea…

php 时间选择,PHP-在学说2中的日期之间选择条目

PHP-在学说2中的日期之间选择条目我将因这个无法修复的最小错误而发疯。 我想在两天之间选择条目&#xff0c;下面的示例说明了我所有的失败&#xff1a;选择1。$qb->where(e.fecha > . $monday->format(Y-m-d));$qb->andWhere(e.fecha < . $sunday->forma…

threadlocal线程_线程故事:Web应用程序中的ThreadLocal

threadlocal线程本周&#xff0c;我花了一些合理的时间来消除Web应用程序中的所有ThreadLocal变量。 原因是他们造成了类加载器泄漏&#xff0c;我们不能再适当地取消部署我们的应用程序。 取消部署应用程序后&#xff0c;当GC根目录继续引用应用程序对象时&#xff0c;将发生类…

java开发门禁指纹,指纹门禁

大兀人脸识别控制系统USB指纹仪DW9拓扑图(指纹为java系统直接采集、云或控制板直接比对&#xff0c;无需二次注册&#xff0c;人脸为htttp上传服务器或rtsp视频流比对方案)大兀活体指纹门禁采用BS架构&#xff0c;已集成进大兀人脸识别系统&#xff0c;如二次开发可直接调用jav…

使用Selenide进行有效的UI测试

等待奇迹 圣诞节是奇迹的时刻。 在新的一年的前夕&#xff0c;我们都为下一年制定了计划。 我们希望所有问题都将在最后一年消失&#xff0c;在来年出现奇迹。 每个Java开发人员都梦想着创造一个奇迹&#xff0c;使他成为世界上最有效的Java开发人员。 我想向你展示这样的奇…

android之seekbar

做了一个拖动滑块改变数值的demo 下附上代码: <SeekBar android:id"id/myseekbar" android:layout_width"match_parent" android:layout_marginTop"20dp" android:thumb"drawable/slider" android:layout_height&qu…

php 微信小程序 循环 多选,微信小程序实现多选功能

本文为大家分享了微信小程序实现多选功能的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码&#xff1a;{{num 1}}/{{quesyion.length}}{{question[num][0]}}A {{question[num][1]}}B {{question[num][2]}}C {{question[num][3]}}D {{question[num][4]}}正确答案…

今天在看慕课网的java学习路径

new对象是静态加载类 在编译时刻就需要加载所有可能使用的类 如果有有一个类没有 其他的类也无法使用 通过动态加载类可以解决这个问题 class for name 打印异常栈轨迹Stack Trace。说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法 classforName //加载…

php+反序列化代码执行漏洞,PHP反序列化漏洞

0x001 漏洞产生原理在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测&#xff0c;导致攻击者可以控制反序列化过程&#xff0c;从而导致XSS、代码执行、文件写入、文件读取等不可控后果。0x002 漏洞触发条件一般只能通过代码审计的方式挖掘该漏洞…

java 应用程序 gui_Java GUI应用程序关闭陷阱

java 应用程序 gui最近&#xff0c;我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题。 他们似乎是一个过程&#xff0c;消耗着计算机资源。 今天&#xff0c;我深入探究了问题的根源&#xff0c;这是一个我以前不曾意识到的棘手陷阱&#xff0c;所以我想我会分享一下…

php动态成本管理,网上审批系统环境下的动态目标成本管理

1.预测目标价格和销售量目标价格是根据市场可接受的价格范围、企业自身的竞争优势和企业的经营理念等因素来确定的。在确定目标价格的同时&#xff0c;需要确定在这种价格下企业的预计销售量&#xff0c;因为销售量影响生产量&#xff0c;生产量影响作业量&#xff0c;作业量影…

学习进度(第三周)

所花时间 9.5h 代码量 350行 博客量 2篇 了解到的知识点 Hadoop HBase数据库 转载于:https://www.cnblogs.com/yifengyifeng/p/6542224.html

Java中的值类型:为什么它们不可变?

值类型不必是不变的。 但是他们是。 在上一篇文章中&#xff0c;我讨论了Java中指针与引用之间的区别以及如何传递方法参数&#xff08;按值传递或按引用传递&#xff09;。 这些与Java中尚不存在的值类型密切相关&#xff08;尚未&#xff09;。 John Rose&#xff0c;Brian…

mac设置首页访问php,mac系统下php项目除了首页全访问不了

有网友反映mac配置apache的有问题&#xff0c;除了首页全都访问不了&#xff0c;小编找来了相关的解决办法&#xff0c;有需要的朋友可以来了解一下。httpd.conf配置文件中加载了mod_rewrite.so模块AllowOverride None 将None改为 AllDocumentRoot "/Library/WebServer/Do…

java filter 模式,Java设计模式----过滤器模式(挑三拣四)

过滤器模式描述拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器&#xff0c;并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请求传给相…