尝试在Cassandra表中提取行时发生java.lang.NumberFormatException

uqxowvwt  于 2022-09-27  发布在  Cassandra
关注(0)|答案(2)|浏览(130)

我使用Datastax驱动程序在Cassandra表中提取一行:

MappingManager manager = new MappingManager(session);
 Mapper<CassandraEntity> mapper = manager.mapper(CassandraEntity.class);
 UUID id = UUID.fromString(uuid);    
 CassandraEntity cassandraEntity = mapper.get(id);

当uuid存在于表中时,一切正常。但当uuid不存在时,我会出现以下错误:

ERROR [2017-01-27 14:27:24,030] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 48a3bf442525acf8
! java.lang.NumberFormatException: For input string: "68c34e83db3o"
! at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.7.0_75]
! at java.lang.Long.parseLong(Long.java:441) ~[na:1.7.0_75]
! at java.lang.Long.valueOf(Long.java:513) ~[na:1.7.0_75]
! at java.lang.Long.decode(Long.java:665) ~[na:1.7.0_75]
! at java.util.UUID.fromString(UUID.java:206) ~[na:1.7.0_75]

我怎样才能很好地管理这个错误?

w6mmgewl

w6mmgewl1#

68c34e83db3o不是有效的UUID,因此UUID.fromString正在引发此异常,javadocs状态为:
投掷次数:
IllegalArgumentException-如果名称与字符串不符?toString()中描述的表示
NumberFormatExceptionIllegalArgumentExcepiton的示例。
在将其传递到fromString之前,您是如何形成uuid的?在调用fromString之前,可能需要进行一些格式化/加密。68c34e83db3o几乎看起来像一个十六进制字符串(除了最后的o)。

cotxawn7

cotxawn72#

c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3o不是有效的UUID。UUID的十六个八位字节表示为32个小写十六进制(基数16)数字,以连字符分隔的五组显示,格式为8-4-4-4-12,共36个字符(32个字母数字字符和四个连字符)。因此:

  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3a是有效的UUID
  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3b是有效的UUID
  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3c是有效的UUID
  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3d是有效的UUID
  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3e是有效的UUID
  • c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3f是有效的UUID

但c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​db3g不是有效的UUID,也不是c37d661d-7e61-49ea-96a5-68c34e83‌​‌​‌​数据库3o**
要快速检查UUID是否有效,可以使用此Fiddle:https://jsfiddle.net/mshaffer/6e2Ljh97
正如Andy Tolbert所说,当UUID无效时,UUID.fromString方法抛出一个IllegalArgumentException。要处理此异常,请使用How to judge a string is UUID type?中给出的解决方案:

try{
    UUID uuid = UUID.fromString(someUUID);
    //do something
} catch (IllegalArgumentException exception){
   //handle the case where string is not valid UUID 
}

相关问题