Java 当';不存在状态时,ctx.stub.getState(KEY)返回什么;键';?

Java 当';不存在状态时,ctx.stub.getState(KEY)返回什么;键';?,java,hyperledger-fabric,Java,Hyperledger Fabric,在Hyperledger结构的商业票据示例中,有一个StateListImpl类实现getState,如下所示: @覆盖 公共状态getState(字符串键){ CompositeKey-ledgerKey=this.ctx.getStub().createCompositeKey(this.name,State.splitKey(key)); byte[]data=this.ctx.getStub().getState(ledgerKey.toString()); 如果(数据!=null){

在Hyperledger结构的商业票据示例中,有一个StateListImpl类实现getState,如下所示:

@覆盖
公共状态getState(字符串键){
CompositeKey-ledgerKey=this.ctx.getStub().createCompositeKey(this.name,State.splitKey(key));
byte[]data=this.ctx.getStub().getState(ledgerKey.toString());
如果(数据!=null){
State State=this.deserializer.deserialize(数据);
返回状态;
}否则{
返回null;
}
}
但是,当我用一个不存在的键调用这个
StateListImpl.getState
函数时,条件
data!=null
为true(反序列化程序中出现异常),因此
ctx.stub.getState(ledgerKey)
似乎没有返回null。我在fabric文档(和its)中搜索过,但没有说明当
键不在分类账中时会发生什么


那么,返回的是
ctx.stub.getState(KEY)
如果
KEY
state不在分类账中?

在Java中检查null是不够的,您还必须检查字节数组的长度,我使用以下代码:

final String data = stub.getStringState(id);
if (StringUtils.isEmpty(data)) {
    throw new RuntimeException(
      String.format("The item %s doesn't exist", id)
    );
 }
如果我们仔细观察StringUtils.isEmpty,它会检查长度

public static boolean isEmpty(CharSequence cs) {
    return cs == null || cs.length() == 0;
}

这是因为getState不返回空值。相反,它返回一个“未定义”的对象。
因此,如果您将代码更改为
getState(key)==undefined
,那么它应该可以正常工作

谢谢,但我要求的是java智能合约谢谢,我怀疑
getState
的情况类似。一个官方的例子不能很好地面对这一点,这是非常令人担忧的。