概述:

出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常。

问题描述:

第一种:

 out.println(request.getParameter("username"));  

如果request里面并没有username的值,这时无法对空对象进行操作的,就会抛出异常。

第二种:

String userName = request.getParameter("username");    If (userName.equals("root"))    {....}  

如果没有username值,或者username为null时,是不能将一个为null的对象与另外一个对象进行比较的。

If ("root".equals(user Name))    {....} 

如果返回值与常量进行比较时,就可以避免调用null对象的equals方法。不会抛出异常。

第三种:
假设有一个student类,有属性name。

Student a; String b = a.name; 

这个时候就会报错,因为a为空的,解决办法就是让a指向一个对象,Student a = new Student();

问题定位:

对于日志中的报错信息,在java中抛出异常是从内往外,因此只需要重点关注第一行报错信息,下面的报错都是由于一层层传递调用该方法导致。

Java空指针异常的若干解决方案:
Java中任何对象都可以为空,我们可以使用若干种方法来避免产生这类异常。比如我们传统的空值检测,编程规范,以及使用java中各种工具类。

(1)最常用的一种就是直接对 对象进行判断,比如if(Object == null)来对所有用到的对象进行判断,这个对象也就是我们常用的函数参数,返回值,以及类实例的成员变量等。当我们检测到null值时,我们可以异常的类型抛出更具有针对性的异常类型,再附加上我们自己加的消息内容。我们也可以直接使用一些库函数来简化代码:

Object checkData = Object.requireNoNull(resultMessage,"The resultMessage must not be null") 

如果我们使用过Lombok工具的话,里面有一个@NotNull注解,就是指被注释的元素不能为空,就会自定检测。

(2)第二种方法就是遵守编程规范,可以减少一定的空指针异常的发生。

Strings.isNullOrEmpty(str); CollectionUtils.isEmpty(collection); StringUtils.isEmpty(str);  if(object != null) {     object.toString();) } // 使用toString()这种方法的话,如果object为空的话,就会抛出异常  String.valueOf(object) //将Object转换为字符串,不管是否为null,不会抛出异常 

如果返回是集合类型。而且是空的,不要返回null值,而是要返回一个空的集合,如果返回类型是对象的话,我们可以抛出异常。

public class Example {      private static List<Integer> numbers = null;        public static List<Integer> getList() {           if (numbers == null)                return Collections.emptyList();           else                return numbers;      } } 

检查一个方法的参数,在执行方法之前,确保检查了参数是否null,当参数被适当检查后,方法会继续执行。否则抛出叫做llegalArgumentException的异常,并通知调用的方法传入的参数有误。

使用三元运算符,可以避免NullPointerException,形式如下:
boolean expression ? value1:value2;

存在NullPointerException的安全方法:

第一种使用instanceof 操作符
即使对象的引用为null,instanceOf操作符可使用。当引用为null时,instanceof操作符返回false,而且不会抛出NullPointerException,比如:

String str = null; if(str instanceof null) {     log.error(.......) } 

如何避免:

确保所有对象在使用之前被初始化。

热门文章

和田宠物医院污水处理方案(宠物医院污水处理方式)

摘要: 今天给各位分享和田宠物医院污水处理方案的知识,其中也会对宠物医院污水处理方式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、医院污水处理操.

C#实现文件Move和Copy操作_C#教程_

文件移动(Move)操作和文件的复制(Copy)是C#程式开发经常遇到的方法,根据传入的源文件地址和目标文件地址参数,实现对文件的操作。实现代码如下: Move操作代码 public static

被猫抓了一下红色划痕鼓起来了要打疫苗吗(被猫抓了红色划痕凸起的)

摘要: 本篇文章给大家谈谈被猫抓了一下红色划痕鼓起来了要打疫苗吗,以及被猫抓了红色划痕凸起的对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、被猫用爪子抓破了要去..

1月5日更新20.2M/S,2025年最新高速V2ray/SSR/Clash/Shadowrocket订阅链接免费节点地址分享

这一次的节点更新覆盖了日本、香港、欧洲、新加坡、美国、加拿大、韩国等地区,最高速度可达20.2 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

2月8日更新20.4M/S,2025年最新高速SSR/Shadowrocket/V2ray/Clash订阅链接免费节点地址分享

这一次的节点更新覆盖了加拿大、美国、韩国、日本、新加坡、欧洲、香港等地区,最高速度可达20.4 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

2月22日更新21M/S,2025年最新高速SSR/Shadowrocket/V2ray/Clash订阅链接免费节点地址分享

这一次的节点更新覆盖了香港、日本、加拿大、韩国、新加坡、美国、欧洲等地区,最高速度可达21 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

1月4日更新19.5M/S,2025年最新高速Clash/SSR/V2ray/Shadowrocket订阅链接免费节点地址分享

这一次的节点更新覆盖了美国、加拿大、香港、欧洲、新加坡、韩国、日本等地区,最高速度可达19.5 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

家养2个月小猫咬出血要紧吗(2个月的猫咬出血要紧吗)

摘要: 今天给各位分享家养2个月小猫咬出血要紧吗的知识,其中也会对2个月的猫咬出血要紧吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、被2个月小.

动物疫苗市场的现状和趋势 动物疫苗市场的现状和趋势分析

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于动物疫苗市场的现状和趋势的问题,于是小编就整理了2个相关介绍动物疫苗市场的现状和趋势的解答,让我们一起看看吧。以后的宠物医院前景

动物预防针多少钱 动物预防针多少钱一针

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于动物预防针多少钱的问题,于是小编就整理了3个相关介绍动物预防针多少钱的解答,让我们一起看看吧。兽医站打疫苗要不要钱?做狂犬疫苗抗

归纳