NPE的一些理解

什么是 NullPointerException?

NullPointerException 是 Java 中的一种运行时异常,表示程序试图对一个 null 对象执行某种操作时发生的错误。例如,访问一个为 null 的对象的方法或属性。

常见导致 NPE 的场景

以下是一些典型会导致 NPE 的代码示例:

  1. 调用一个为 null 的对象的方法

    String str = null;
    str.length();  // 抛出 NullPointerException
    
  2. 访问一个为 null 的对象的字段

    class Person {String name;
    }
    Person person = null;
    String name = person.name;  // 抛出 NullPointerException
    
  3. 使用 null 作为数组对象

    int[] array = null;
    int length = array.length;  // 抛出 NullPointerException
    
  4. 自动拆箱时

    Integer num = null;
    int value = num;  // 抛出 NullPointerException,因为自动拆箱 num.intValue() 被调用
    
  5. 在集合操作中

    Map<String, String> map = new HashMap<>();
    String value = map.get("key");  // 如果 value 是 null,接下来对它调用方法可能导致 NPE
    value.toUpperCase();  // 抛出 NullPointerException
    

如何避免 NPE?

  1. 提前检查 null: 使用显式的 if 判断来检查变量是否为 null

    if (str != null) {System.out.println(str.length());
    }
    
  2. 使用 Optional(Java 8 引入): 避免直接操作可能为 null 的变量。

    Optional<String> optional = Optional.ofNullable(str);
    optional.ifPresent(s -> System.out.println(s.length()));
    
  3. 初始化变量: 在声明变量时就初始化,避免出现未赋值的 null

    String str = "";  // 空字符串而不是 null
    
  4. 使用 Objects.requireNonNull(): 对关键变量进行非空检查,快速抛出异常。

    String str = Objects.requireNonNull(input, "Input cannot be null");
    
  5. 代码规范

    • 不要返回 null,可以返回空集合、空字符串等替代。
    • 避免链式调用(a.b.c.d),除非明确每一步都不可能为 null
  6. @NonNull 注解(依赖工具): 借助工具(如 Lombok 或 IDE)自动检测和标注变量是否可以为 null

典型 NPE 错误的例子

假设你调用了一个 API,但返回值没有检查是否为 null

String value = someMethod();  // 返回值可能为 null
System.out.println(value.toUpperCase());  // 如果 value 为 null,这里会抛出 NPE

通过 null 检查修复:

String value = someMethod();
if (value != null) {System.out.println(value.toUpperCase());
} else {System.out.println("Value is null");
}

总结

NPE 是 Java 开发中非常常见的异常,但通过良好的编程习惯和工具的辅助,可以有效避免它的发生。关键是要对程序中可能为 null 的对象保持敏感,并进行适当的处理。

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

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

相关文章

电子应用设计方案-58:智能沙发系统方案设计

智能沙发系统方案设计 一、引言 智能沙发作为一种融合了舒适与科技的家居产品&#xff0c;旨在为用户提供更加便捷、舒适和个性化的体验。本方案将详细介绍智能沙发系统的设计思路和功能实现。 二、系统概述 1. 系统目标 - 实现多种舒适的姿势调节&#xff0c;满足不同用户的…

【vue-codemirror】Vue中强大的编辑器插件--vue-codemirror

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Linux下学【MySQL】所有常用类型详解( 配实操图 通俗易懂 )

每日激励&#xff1a;“当你觉得你会幸运时&#xff0c;幸运就会眷顾你&#xff0c;所以努力吧&#xff0c;只要你把事情做好&#xff0c;并觉得你会幸运&#xff0c;你将会变得幸运且充实。” 绪论​&#xff1a; 本章继续学习MySQL的知识&#xff0c;本章主要讲到mysql中的所…

迁移学习中模型训练加速(以mllm模型为例),提速15%以上

根据模型训练过程的显存占用实测的分析,一个1g参数的模型(存储占用4g)训练大约需要20g的显存,其中梯度值占用的显存约一半。博主本意是想实现在迁移学习(冻结部分参数)中模型显存占用的降低,结果不太满意,只能实现训练速度提升,但无法实现显存占用优化。预计是在现有的…

你了解网络层的 ICMP 吗?

你了解网络层的 ICMP 吗&#xff1f; 一. 什么是 ICMP二. ICMP 的工作原理三. ICMP 的结构四. ICMP 的常见应用五. ICMP 的局限性与安全性六. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神…

32.在 Vue 3 中上传 KML 文件并在地图上显示

前言 在现代的地理信息系统&#xff08;GIS&#xff09;应用中&#xff0c;我们经常需要将地理空间数据加载到地图中以供可视化展示。KML&#xff08;Keyhole Markup Language&#xff09;是一种基于 XML 格式的文件格式&#xff0c;广泛用于存储地理信息数据&#xff0c;特别…

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…

使用cuda12编译时报错block_merge_sort.cuh(169): error: expected a “,“ or “>“

模型的工程化版C程序使用CUDA11.3和11.6编译时没任何错误&#xff0c;为适应高版本的jetpack环境&#xff0c;切换到CUDA12编译时总是报错: /workspace/cuda-12.0/bin/nvcc /workspace/focc/iou3d_nms.cu -c -o ./build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.…

React状态管理常见面试题目(二)

为什么 Redux 能做到局部渲染? Redux能做到局部渲染&#xff0c;主要是因为它采用了单向数据流和状态管理机制。在Redux中&#xff0c;整个应用的状态被存储在一个单一的store中&#xff0c;当状态发生变化时&#xff0c;Redux通过分发action来更新state&#xff0c;并通过re…

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

《红队和蓝队在网络安全中的定义与分工》

网络安全中什么是红队蓝队 在网络安全领域&#xff0c;红队和蓝队是一种对抗性的演练机制&#xff0c;用于测试和提升网络安全防御能力。 红队&#xff08;Red Team&#xff09; 定义与目标 红队是扮演攻击者角色的团队。他们的主要任务是模拟真实的网络攻击&#xff0c;利用各…

Redis 和 Mysql 中的数据一致性问题

Redis 和 MySQL 的数据很难直接实现 强一致性&#xff0c;但可以通过一些策略尽量接近或实现 最终一致性。下面从两者的特性、挑战以及解决方案来分析。 Redis 和 MySQL 的特性 Redis&#xff1a; 是一个基于内存的高性能键值数据库&#xff0c;常用于缓存、分布式锁和消息队…

数据结构 ——二叉树转广义表

数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树&#xff0c;转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根&#xff08;左子树&#xff09;&#xff08;右子树&#xff09;) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…

企业车辆管理系统(源码+数据库+报告)

一、项目介绍 352.基于SpringBoot的企业车辆管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&a…

ubuntu20.04复现 Leg-KILO

这里写目录标题 opencv版本问题下载3.2.0源代码进入解压后的目录创建构建目录运行 CMake 配置 配置时指定一个独立的安装目录&#xff0c;例如 /opt/opencv-3.2&#xff1a;出错&#xff1a; 使用多线程编译错误1&#xff1a; stdlib.h: 没有那个文件或目录错误2&#xff1a;er…

如何保证开源AI呼入机器人和AI呼出机器人的数据安全性?

如何保证开源AI呼入机器人和AI呼出机器人的数据安全性&#xff1f; 作者&#xff1a;开源呼叫中心FreeIPCC 确保开源AI呼入机器人和AI呼出机器人的数据安全性是部署这些智能系统时不可或缺的一部分。随着越来越多的企业依赖于自动化客户服务和外呼营销&#xff0c;保护用户隐…

基于SpringBoot+vue的高校学生成绩管理系统

目录 一、绪论1.1 开发背景1.2 系统开发平台1.2.1 Vue简介1.2.2 IDEA简介1.2.3 MySQL简介 1.3 系统开发环境 二、需求分析2.1 系统需求分析2.2 系统数据流图 三、概要设计3.1 业务流程分析 四、详细设计4.1 系统功能结构图4.2 E-R模型4.3 数据库表设计 五、模块实现5.1 管理员主…

微信小程序苹果手机自带的数字键盘老是弹出收起,影响用户体验,100%解决

文章目录 1、index.wxml2、index.js3、index.wxss1、index.wxml <!--index.wxml--> <view class="container"><view class="code-input-container"><view class="code-input-boxes"><!-- <block wx:for="{{…