我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中NullPointerException的解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中NullPointerException的解决方法

本篇内容介绍了“Java中NullPointerException的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

null在Java中带来的麻烦

我相信所有的Java程序猿一定都遇到过 NullPointerException ,空指针在Java程序中是最常见的,也是最烦人的;它让我们很多程序猿产生了根深蒂固的感觉,所有可能产生空指针的地方都得加上 if-else 检查,但是这带给我们很多麻烦。

  • Java本身是强类型的,但是null破坏了这个规则,它可以被赋值给任何对象

  • Java的设计是让程序猿对指针无感知,但是null指针是个例外

  • 它会是代码变得很臃肿,到处都充斥着 if-else 的空检查,甚至是多层嵌套,代码可读性下降

  • null本身毫无意义,表示不了 

前两点不需要特别的说明,后两点举个例子来说明一下:假如一个人拥有一个手机,每个手机都有生成厂商,每个厂商都会有个名字,用类表示的话:

public class Person {     private Phone phone;      public Phone getPhone() {         return phone;     } }  public class Phone {     private Producer producer;      public Producer getProducer() {         return producer;     } }  public class Producer {     private String name;      public String getName() {         return name;     } }

在这个例子中,假如我们需要取到手机生成厂商的名字

public String getPhoneProducerName(Person person) {     return person.getPhone().getProducer().getName(); }

由于不一定每个人都会有一个手机,所有在调用 getProducer() 时可能会出现 NullPointerException 。

一门设计语言本来就是来描述世界的,在这个事例中有的人有手机,有的人也可能没有手机,所以在调用 person.getPhone() 返回的值就应该包含有和无这两种情况,现在通过返回 null 来表示无,但是在调用 getProducer() 却又会抛出异常,这样就不太符合现实逻辑;所以把 null 来用来表示  不合适

在遇到这种情况通常的做法是做null检查,甚至是每个地方可能发生null指针的做检查。

public String getPhoneProducerName(Person person) {     if (person.getPhone() == null) {         return "无名字";     }     if (person.getPhone().getProducer() == null) {         return "无名字";     }     return person.getPhone().getProducer().getName(); }

这里我已经试图在减少代码的层级,如果使用的是 if-else ,代码的层级会更深,代码可读性下降。

Optional的简单介绍

吐槽了那么多现状的不好,现在可以祭出我们的解决方案了 Optional ;千呼万唤始出来,犹抱琵琶半遮面;那 Optional 到底是个什么东西,我们一起来逐步解开它的面纱。

Java中NullPointerException的解决方法

Optional 本身只是对对象的简单包装,如果对象为空,那么会构建一个空的 Optional ;这样一来 Optional 就包含了存在和不存在两个情况, 接下来可以看下上面的例子改过之后

public class Person {     private Optional<Phone> phone;      public Optional<Phone> getPhone() {         return phone;     } }  public class Phone {     private Producer producer;      public Producer getProducer() {         return producer;     } }  public class Producer {     private String name;      public String getName() {         return name;     } }

由于有的人可能没有手机,有的人有,所以 Phone 需要用 Optional 包装起来;手机本身一定会有生产的厂商,厂商一定会有一个名字,所以这两个不需要用 Optional 包装起来。这里我们会发现使用了 Optional 会丰富代码的语义,让代码更加符合现实。

而当我们在调用 phone.getProducer().getName() 的时候不需要做null指针的检查,如果说在这里发生了 NullPointerException ,说明这里数据本身是有问题的,不符合现实,就应该让问题暴露出来,而不是像上面的代码一样把问题掩盖。

Optional的常用方法使用

1. Optional的创建方法

Optional<Person> empty = Optional.empty();  //申明一个空的Optional Optional<Person> person = Optional.of(new Person()); //包装Person Optional<Person> person2 = Optional.of(null); //不允许的操作,传入null 会抛出空指针异常 Optional<Person> optionalPerson = Optional.ofNullable(null); //允许传null, 返回一个空的Optional

2. Optional值的获取方式

  • map、flatMap 首先我们重新定义一下Phone类,除了有生产厂商之外,还有个型号;

public class Phone {     private String model;     private Producer producer;      public Producer getProducer() {         return producer;     }     public String getModel() {         return model;     } }

当我们需要获取到手机的型号的时候可以这样:

Optional<Phone> optionalPhone = Optional.of(new Phone()); Optional<String> model = optionalPhone.map(Phone::getModel);

当我们需要通过Person对象获取到Phone的型号,会想到这样:

Optional<Person> optionalPerson = Optional.of(new Person()); optionalPerson.map(Person::getPhone).map(Phone::getModel);

当我们写出来的时候发现编译器不能通过。是因为 Person::getPhone 返回的是一个 Optional<Phone> ,调用 optionalPerson.map(Person::getPhone) 返回的就是 Optional<Optional<Phone>> ,所以再 .map 的就无法拿到手机型号,那如何能够让返回的结果不是 Optional<Optional<Phone>> ,而是 Optional<Phone> 呢?

这里需要用到另一个方法 flatMap 。 flatMap 和 map 的区别,我在刚开始学习的时候,看到了网上的各种解释都很绕,看的很晕,最后直接打开源码来看,发现实现很简单,很容易理解,来看下源码:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {     Objects.requireNonNull(mapper);     if (!isPresent())         return empty();     else {         return Optional.ofNullable(mapper.apply(value));     } } public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {     Objects.requireNonNull(mapper);     if (!isPresent())         return empty();     else {         return Objects.requireNonNull(mapper.apply(value));     } }

map 方法在返回的时候会包装一层 Optional ; flatMap 在返回的时候直接把函数的返回值返回了,函数的结果必须是 Optional ;那么在前面的例子中我们直接调用 flatMap 返回的结果就是 Optional<Phone>

Optional<Person> optionalPerson = Optional.of(new Person()); optionalPerson.flatMap(Person::getPhone).map(Phone::getModel);
  • 取出 Optional 中的值对象:get、orElse、orElseGet、orElseThrow、ifPresent

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. get() : 当你明确知道Optional中有值的话可以直接调用该方法,当Optional中没有值是该方法会抛出异常 NoSuchElementException ;所以当如果存在空值的话建议就不要调用该方法,因为这样和做null检查就没有区别了

  3. orElse(T other) : 提供一个默认值,当值不存在是返回这个默认值

  4. orElseGet(Supplier<? extends T> other) : 当值不存在的时候会调用supper函数,如果说返回这个默认值的逻辑较多,那么调用这个方法比较合适;

  5. orElseThrow(Supplier<? extends X> exceptionSupplier) : 当值为空时会抛出一个自定义的异常

  6. ifPresent(Consumer<? super T> consumer) : 当值不为空是会调用 consumer 函数,如果值为空,那么这个方法什么都不做

  • filter 过滤出满足条件的对象 假如我们需要过滤出手机型号 IOS 的手机,并打印出型号,代码如下:

Person person = new Person(Optional.of(new Phone("IOS")));         Optional<Person> optionalPerson = Optional.of(person);         optionalPerson.flatMap(Person::getPhone)                 .filter(phone -> "IOS".equals(phone.getModel()))                 .map(Phone::getModel)                 .ifPresent(System.out::println);
  1. 我们讨论了null在Java程序的问题

  2. 介绍Java8中引入了 Optional 来表示有和无的情况以及初始化的方式

  3. 举例说明了 Optional 中经常使用到的方法

“Java中NullPointerException的解决方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中NullPointerException的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 中 NullPointerException 的完美解决方案

在 Java 中,NullPointerException 是一种常见的运行时异常,它表示一个对象引用为 null,而尝试使用该对象引用调用方法或访问其属性。解决 NullPointerException 的最佳方案是遵循以下几个步骤:1.
2023-09-22

详解Java中NullPointerException异常的原因以及解决方法

NullPointerException是Java中常见的异常之一,通常是在运行时发生的。该异常表示程序试图访问一个空对象的属性或调用空对象的方法。造成NullPointerException异常的原因主要有以下几种:1. 对象引用为nul
2023-08-11

无感NullPointerException的值相等判断方法

当我们需要去判断一个入参/查库返回的开关变量(通常是个Integer类型的)时,常ju常会写如下的if-else判断语句。但又会为在生产环境看到的「NullPointerException」感到困扰,遇到这个问题如何处理呢,下面小编通过本文给大家详细讲解,需要的朋友参考下吧
2023-02-17

java中解决中文乱码的方法

java中解决中文乱码的方法:POST请求中文乱码处理(在获得参数值之前设置)req.setCharacterEncoding("UTF-8");GET请求处理中文乱码//String username = req.getParameter("username
java中解决中文乱码的方法
2019-04-07

Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerException)问题的解决方法

在Android中,很多人会用如下的方法判断当前网络是否可用: public static boolean isNetworkAvailable() { boolean isAalabl
2022-06-06

java中解压乱码解决方法

第一种使用ant实现的zip解压缩,其中解压的乱码注意使用public void unZip(String unZipFileName,String outputPath) 其中this.zipFile = new ZipFile(unZipFileName,
java中解压乱码解决方法
2020-06-12

java中wait调用中断的解决方法

这篇文章主要介绍java中wait调用中断的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,
2023-06-14

java中string乱码解决方法

java中string乱码解决方法:(推荐:java视频教程)对字符串进行转码来解决字符串乱码代码如下:System.out.println(str); String str1 = new String(str.getBytes("ISO
java中string乱码解决方法
2021-08-15

java中url乱码解决方法

java中url乱码解决方法:(推荐:java视频教程)1、将字符串转码:newString(“xxxxx”.getBytes(“iso-8859-1”),”utf-8”)这种转码方式有很大的弊端,因为它是使用指定的字符集将此String编码为 byte 序列
java中url乱码解决方法
2017-05-02

java中request乱码解决方法

POST中文乱码解决方式:POST通过request body传递参数。设置response的字符流的编码方式为UTF-8。request.setCharacterEncoding("UTF-8"); 这句话解决了POST方式提交的中文乱码问题,这个方法设置了
java中request乱码解决方法
2019-08-18

java中ThreadLocal内存泄漏的解决方法

小编给大家分享一下java中ThreadLocal内存泄漏的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型
2023-06-14

java中请求乱码解决方法

出现的问题:通过get请求向服务器发送请求时,如果请求参数为中文时,服务器端接受到的参数为乱码。乱码原因分析及解决办法:1、关于解码和编码编码:'中'→1110001解码:1110001→'中'乱码:编码和解码过程中使用了不同的字符集2、Web应用中字符编码解
java中请求乱码解决方法
2020-03-30

java中url传中文时乱码的解决方法

Java中URL传中文时乱码的问题相信不少朋友都遇到过,最近就遇到一个问题,就是在Action当中把一条中文信息绑定在URL的后面,ActionForward到别一个页面时,用reqeust.getParameter取出是出现乱码的问题。推荐:java视频教程
java中url传中文时乱码的解决方法
2015-07-15

java中显示中文乱码解决方法

java显示乱码解决方法:1、utf8解决JSP中文乱码问题一般说来在每个页面的开始处,加入:charset=UTF-8的作用是指定JSP向客户端输出的编码方式为“UTF-8”;pageEncoding="UTF-8",为了让JSP引擎能正确地解码含有中文字符
java中显示中文乱码解决方法
2018-10-05

编程热搜

目录