2017-07-29 83 views
0

我目前想獲得familar與Messagepack爲Java https://github.com/msgpack/msgpack-java的Java MessagePack空檢查

我通過MQTT獲取數據。如果「變量」是不是NULL一切都很好,但變量也可以爲NULL,在這種情況下,我會得到這個異常「預期的詮釋,卻得到了零(CO)」

MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(m.getPayload()); 
int  einInt   = unpacker.unpackInt(); 
String einString  = unpacker.unpackString(); 

到目前爲止,我沒有能夠想出如何讓空回 我想避免使用try/catch語句所以目前我使用這種方式

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

有沒有bedder方式?

+0

它應該是相反的,不是嗎? Integer einInt = unpacker.getNextFormat()。equals(「NIL」)? null:unpacker.unpackInt();''int'不能接收空值。當然 – davidxxx

+0

你是對的,對了:) – Nisbo

回答

0

我看着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); 
... 
+0

THX的答案 貌似的ToString()的頭THX需要 'unpacker.getNextFormat()。的toString()。等於( 「無」)' – Nisbo

+0

是的,因爲您不使用'MessageFormat'枚舉類,而是使用String:'「NIL」'與枚舉值的'toString()'表示法進行比較。我編輯,以顯示如何避免它。就像在示例代碼中一樣。 – davidxxx