⛳️ 空安全
Forest 字符串模板中的变量引用,默认情况下是不能直接引用一个未定义的变量的
// 若变量 name 未定义,则会直接报错
@Get(url = "http://localhost:8080/{name}")
String send();
1
2
3
2
3
# 空安全操作符
但是,自v1.7.1
版本之后,Forest字符串模板支持空安全语法,在变量名之后使用空安全操作符(问号 ?
),可以让它不再报错,而是直接返回 null 值。
// 若变量 name 未定义,则会直接返回 null
// 若变量 name 有值,则返回它自身的值
@Get(url = "http://localhost:8080/{name?}")
String send();
1
2
3
4
2
3
4
或者,引用了一个不存在的或值为 null 的变量后,再用点.
访问它的属性,直接这样写自然是会报错的。然而也可以通过空安全属性访问操作符?.
自动判断是否为空。
// 会先判断 a 是否为空,如果 a 为空则直接 null 值,不会再继续解析下去
// 如果 a 不为空,则返回 a.b 的值
@Get(url = "http://localhost:8080/{a?.b}")
String send();
1
2
3
4
2
3
4
使用?.
符号连接起来的空安全调用链,无论链路多长,只要其中一个为空,则直接中断并返回 null,不用担心报空指针错误
// 会先判断 a 是否为空,再判断 a.b 是否为空,再判断 a.b.c,..., 一直递归判断到链路的末尾
// 只要其中一个变量或属性值为空,就会立即中断并返回 null
// 如果全不为空,那自然就会返回链路的最后一个属性的值
@Get(url = "http://localhost:8080/{a?.b?.c?.d?.e}")
String send();
1
2
3
4
5
2
3
4
5
# Elvis 表达式
空安全操作符?
和?.
的确是能有效解决空指针异常问题,但最后总返回一个 null 值也是很不美观啊。而且有些场景,比如 url 中的参数、或请求头中的参数不能直接传一个 null,而是空字符串,或其他默认值。
这时就可以使用 Elvis 操作符??
,也称为是空值合并操作符。简单来说就是在一个变量或一个表达式后面追加两个问号(??
),并在它的右边再跟上一个表达式作为左边变量或表达式为空的情况下所返回的默认值
// 如果变量 a 为空或未定义,则返回字符串 ok
// 最后 URL 为 http://localhost:8080/ok
// 若变量 a 不为空,则返回它自己的值
@Get(url = "http://localhost:8080/{a ?? 'ok'}")
String send();
1
2
3
4
5
2
3
4
5
Elvis 表达式也可以和空安全属性访问操作符?.
相结合
// 如果变量 a 为空或未定义,则返回字符串 ok,不会再继续读取 a.b
// 最后 URL 为 http://localhost:8080/ok
@Get(url = "http://localhost:8080/{a?.b ?? 'ok'}")
String send();
1
2
3
4
2
3
4
安全属性访问操作符?.
连接起来的调用链可以无限长,中间只要一个变量或属性值为空,就会直接中断,并返回??
符号后面定义的默认值
// 会先判断 a 是否为空,再判断 a.b 是否为空,再判断 a.b.c,..., 一直递归判断到链路的末尾
// 只要其中一个变量或属性值为空,就会立即中断并返回 ok
// 最后 URL 为 http://localhost:8080/ok
// 如果全不为空,那自然就会返回链路的最后一个属性的值
@Get(url = "http://localhost:8080/{a?.b?.c?.d?.e ?? 'ok'}")
String send();
1
2
3
4
5
6
2
3
4
5
6
一般会将默认值设置为空字符串''
// 如果变量 a 为空或未定义,则返回空字符串
// 最后 URL 为 http://localhost:8080/
@Get(url = "http://localhost:8080/{a ?? ''}")
String send();
// 效果同上
@Get(url = "http://localhost:8080/{a?.b?.c ?? ''}")
String send();
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
帮助我们改善此文档 (opens new window)
上次更新: 2025/06/24, 01:16:57