以下内容摘自雪球,在公司内部的docs上的内容总结,部分隐私信息已经处理改动
在使用gRpc的ClientInterceptor进行拦截器实现tracing功能的时候出现了NULL错误,报错信息如下:
对com.google.common.collect这个google工具包有了解的同学应该知道,在ImmutableMap这个工具类下面有一些代码检查,源码如下:
final class SingletonImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
final transient K singleKey;
final transient V singleValue;
transient ImmutableBiMap<V, K> inverse;
SingletonImmutableBiMap(K singleKey, V singleValue) {
CollectPreconditions.checkEntryNotNull(singleKey, singleValue);
this.singleKey = singleKey;
this.singleValue = singleValue;
}
…… ……
// assert检查部分
@GwtCompatible
final class CollectPreconditions {
CollectPreconditions() {
}
static void checkEntryNotNull(Object key, Object value) {
if (key == null) {
throw new NullPointerException("null key in entry: null=" + value);
} else if (value == null) {
throw new NullPointerException("null value in entry: " + key + "=null");
}
}
可以定位到是给赋值了一个空值导致的
那么为什么这个调用中会出现null的问题?
进一步查看源码发现:在grpc的Status源码中,对于Description这个属性是允许为null
至于出现哪些情况会出现NULL,当时网上查询资料没找到详细的全部解释,只找到一个UNKNOWN状态,这个Description这个属性就是个null值
解决:
在使用Status的description字段的时候进行null判断即可
吐槽:这个官方源码啥想法,为啥会给返回null的值???????