0

0

什么是Java中的防御性编程_前置检查、不变性设计与异常安全说明

P粉602998670

P粉602998670

发布时间:2026-02-11 13:11:08

|

145人浏览过

|

来源于php中文网

原创

Java中必须加null检查的三类位置是:方法入参、外部传入的集合/数组、返回值为Optional以外的引用类型;应优先使用Objects.requireNonNull(),构造函数参数必须检查,Map/List获取后需判空,toString()/equals()中避免隐式null调用。

什么是java中的防御性编程_前置检查、不变性设计与异常安全说明

Java里哪些地方必须加null检查?

不是所有对象都要判空,但三类位置不加就容易在运行时崩:方法入参、外部传入的集合/数组、返回值为Optional以外的引用类型。JDK 8+ 的Objects.requireNonNull()比手写if (x == null)更明确,且能附带提示信息。

  • 构造函数参数必须检查——否则对象一创建就处于非法状态
  • Map.get()List.get()后直接调用方法?先确认是否为null,尤其当键/索引来自用户输入或配置时
  • 避免在toString()equals()里隐式触发null引用——这些方法可能被日志、断言、框架自动调用,出错堆栈难定位

final字段和不可变类真能防bug?

能,但只在「声明即赋值 + 不暴露可变内部状态」的前提下成立。常见误用是把final List当成不可变集合——其实只是引用不可变,内容仍可被add()clear()修改。

  • Collections.unmodifiableList()ImmutableList.of()(Guava)替代final ArrayList
  • 自定义不可变类时,所有字段必须final,且不提供 setter;若含数组或集合,需在构造时深拷贝或包装为不可变视图
  • getter 方法返回集合时,别直接返回私有字段,要返回Collections.unmodifiableXxx()或新副本

try-catch吞掉异常为什么比崩溃还危险?

因为掩盖了本该失败的场景,让错误在下游以更诡异的方式浮现,比如数据错乱、状态不一致、重试逻辑失效。防御性编程不是「兜底容错」,而是「清晰表达契约边界」。

  • 不要捕获ExceptionThrowable然后log.info()完事——至少要重新抛出或转为更明确的业务异常
  • 资源关闭务必用try-with-resources,而不是在catch里手动close()——后者在异常链中可能被跳过
  • NumberFormatException这类可预期异常,优先用预校验(如正则或Integer.parseInt()前先String.matches("\\d+")),而非依赖catch兜底

Spring Controller里怎么写才算防御性?

Web 层是外部输入第一道闸门,这里松懈,后端再严也没用。重点不在“拦住所有非法请求”,而在于「让错误反馈足够早、足够准」。

SolidPoint
SolidPoint

Youtube视频总结器,快速将Youtube长视频压缩成文字摘要

下载

立即学习Java免费学习笔记(深入)”;

  • @Valid配合@NotNull@Size等注解做参数校验,失败直接返回400 Bad Request,别等进 service 才抛IllegalArgumentException
  • 路径变量(@PathVariable)和查询参数(@RequestParam)默认允许null,若业务不允许,显式写required = true
  • 别在 controller 里直接调用repository.save(entity)——entity 可能含未校验字段,应先走 DTO → VO 转换,并在 service 层做领域规则检查

防御性编程最难的不是写检查语句,是判断「这个检查该放在哪一层」以及「检查失败后该让谁来负责修复」。很多人把校验全堆在 DAO 层,结果前端传错格式,后端报ConstraintViolationException,连哪个字段错了都看不出来。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

120

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

77

2026.01.26

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

265

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

665

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

803

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.07.18

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.2万人学习

Java 教程
Java 教程

共578课时 | 63.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号