繁体   English   中英

Java MessagePack空检查

[英]Java MessagePack null check

我试图熟悉Messagepack for Java

我通过Mqtt获取数据。 如果变量不为null一切都很好,但变量也可以为null ,在这种情况下,我将收到以下异常: Expected Int, but got Nil (c0)

MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(m.getPayload());
int someInt              = unpacker.unpackInt();
String someString        = unpacker.unpackString();

到目前为止,我还无法弄清楚如何获取NULL我想避免使用TRY / CATCH,所以目前我正在使用这种方式

int someInt = unpacker.getNextFormat().equals("NIL") ? unpacker.unpackInt() : null;

有没有更好的办法 ?

我看了MessageUnpacker的javadoc,它似乎没有提供更好的方法。

示例代码非常接近您的方式:

 MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(...);
 while(unpacker.hasNext()) {
     MessageFormat f = unpacker.getNextFormat();
     switch(f) {
         case MessageFormat.POSFIXINT:
         case MessageFormat.INT8:
         case MessageFormat.UINT8: {
            int v = unpacker.unpackInt();
            break;
         }
         case MessageFormat.STRING: {
            String v = unpacker.unpackString();
            break;
         }
         // ...
   }
 }

因此,我认为您的做法很正确。
但是,如果您多次重复此检索(很有可能),则可以引入实用程序方法来为您完成工作。

例如对于unpackInt()

public Integer unpackIntOrNull (MessageUnpacker unpacker){
    return unpacker.getNextFormat() == MessageFormat.INT8 ?
           unpacker.unpackInt() : null; 
}

现在,解压缩元素非常直接:

Integer einInt = unpackIntOrNull(unpacker);
Integer einAndereInt = unpackIntOrNull(unpacker);
...

MessageUnpacker有一个名为tryUnpackNil的方法。 如果下一个字节为nil值,则此方法读取它并返回true ,否则不读取任何内容并返回false

这可以用于跳过nil值,并使用以下命令解压缩非nil值:

final MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(data);
final Integer value = unpacker.tryUnpackNil() ? null : unpacker.unpackInt();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM