包装类型的null值处理

程序员零花钱码上赚

 

首先要明白java中为什么要引入包装类型呢?其实是为了解决基本类型实例化问题,让基本类型也能参与到面向对象编程中,把一个整型放到List中,就必须使用Integer包装类型,代码如下:

//计算list中所有元素的和

public static int f(List<Integer> list){

int count = 0;

for(int i :list){

count +=i;

}

return count;

}

//咱们调用一下上面方法,遍历一个列表,然后想加,看看会不会出错哦!

public static void main(String[] agrs){

List<Integer> list = new ArrayList<Integer>();

list.add(1);

list.add(2);

listt.add(null);

System.out.println(f(list))

}

安照上面的传的List中,运行一下结果会是怎么样的,那当然是报错了。nullPointerException,这些原因都是谁造成的呢,当然是是包装类所造成的后果了。

解决办法就是:包装类型参与运算时,要做null值判断
 

### 如何在 Protobuf Proto 文件中处理 Null Protobuf 协议本身并不直接支持 `null` 或者可选字段的概念。为了实现似的逻辑,通常有几种方法可以间接表达或处理 `null` 的概念。 #### 方法一:使用 `optional` 关键字(适用于 Protocol Buffers v3) Protocol Buffers 版本 3 引入了 `optional` 字段修饰符。当定义消息中的某个字段为 `optional` 类型时,在序列化过程中如果该字段未被设置,则不会写入到二进制流里;反序列化读取的时候也不会存在对应的[^1]。 ```protobuf syntax = "proto3"; message Person { optional string name = 1; } ``` 需要注意的是,默认情况下即使指定了 `optional`,对于基本类型如整数、浮点数等仍然无法区分其是否存在还是默认初始化状态。因此这种方法更适合用于字符串或其他复杂类型的字段上。 #### 方法二:引入 Wrapper Types Google 提供了一组标准库 message 定义作为包装,位于 google/protobuf/wrappers.proto 中。这些 wrapper messages 可以用来包裹原始数据类型,并允许它们携带额外的状态信息来指示是否设置了有效[^2]。 例如要表示一个可能为空的布尔: ```protobuf import "google/protobuf/wrappers.proto"; message ExampleMessage { google.protobuf.BoolValue nullable_bool = 1; } ``` 这种方式能够更清晰地区分出 “不存在” 和 “存在但为 false” 这两种情况之间的差异。 #### 方法三:自定义 Oneof 结构 通过 oneof 构造特殊的结构体模式也可以达到似的效果。oneof 是 protobuf 提供的一种特性,它允许多个字段共享同一内存位置并互斥地存储其中的一个成员变量。这使得可以在同一个地方既保存实际的数据又标记是否有赋过[^3]。 下面是一个例子展示如何创建一个既能容纳具体数又能代表缺失的情况的消息格式: ```protobuf message NullableInt32 { oneof kind { int32 value = 1; bool is_null = 2; // 当is_null=true时表示此int32应视为null } } ``` 以上三种方式都可以有效地解决 proto 文件中关于 null 处理的需求,开发者可以根据具体的业务场景和个人偏好选择最合适的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值