首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UUID.fromString()返回无效的UUID?

UUID.fromString()返回无效的UUID?
EN

Stack Overflow用户
提问于 2013-09-18 20:14:11
回答 3查看 38.2K关注 0票数 12

在我的Android应用程序中,我使用了这个方法,它接受一个UUID。不幸的是,当我这样做的时候:

代码语言:javascript
复制
OverviewEvent overviewevent = eventAdapter.getOverviewEvent(UUID.fromString("0f14d0ab-9605-4a62-a9e4-5ed26688389b"));

我收到一个错误,显示为java.lang.IllegalArgumentException: Invalid UUID: 100

getOverviewEvent的实现如下:

代码语言:javascript
复制
public OverviewEvent getOverviewEvent(UUID uuid) throws Exception {
    // Do stuff
}

有人知道我怎么解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2013-09-18 20:30:45

以下是避免使用此方法的解决方法,

代码语言:javascript
复制
String s = "0f14d0ab-9605-4a62-a9e4-5ed26688389b";
String s2 = s.replace("-", "");
UUID uuid = new UUID(
        new BigInteger(s2.substring(0, 16), 16).longValue(),
        new BigInteger(s2.substring(16), 16).longValue());
System.out.println(uuid);

打印

代码语言:javascript
复制
0f14d0ab-9605-4a62-a9e4-5ed26688389b
票数 18
EN

Stack Overflow用户

发布于 2020-03-17 21:23:59

你是否复制并粘贴了代码,我发现一些看起来正确的字符实际上是错误的ACSII代码。

取下-,然后再次更换。

我经常遇到这种情况,因为不同的编辑器/计算机可能使用略有不同的代码。

票数 1
EN

Stack Overflow用户

发布于 2014-09-07 18:03:23

我也有这个问题。我想这是因为我的Java版本太低了。我发现在我的安卓应用程序中,uuid.split("-")uuid.replace("-")都是无用的。我猜这可能是因为Java把"-“当作一个正则表达式。然而,当我尝试uuid.split("\\-")uuid.replace("\\-")时,它们也不起作用。我不知道为什么会这样。我认为这是Java的一个bug。

根据Fildor的评论,在安卓的实现中,使用uuid.split("-")将uuid字符串拆分成5个部分,然后由于前面提到的bug,uuid字符串无法拼接成5个部分,因此抛出了“无效的UUID”异常。

但是,我们可以修改android的源代码来避免这个问题。使用substring()方法,我们可以将uuid字符串分成5个部分。然后我们就可以做uuid了。

以下代码适用于我:

代码语言:javascript
复制
public static UUID makeUuid(String uuidString) {
    String[] parts = {
            uuidString.substring(0, 7),
            uuidString.substring(9, 12),
            uuidString.substring(14, 17),
            uuidString.substring(19, 22),
            uuidString.substring(24, 35)
    };
    long m1 = Long.parseLong(parts[0], 16);
    long m2 = Long.parseLong(parts[1], 16);
    long m3 = Long.parseLong(parts[2], 16);
    long lsb1 = Long.parseLong(parts[3], 16);
    long lsb2 = Long.parseLong(parts[4], 16);
    long msb = (m1 << 32) | (m2 << 16) | m3;
    long lsb = (lsb1 << 48) | lsb2;
    return new UUID(msb, lsb);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18871980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档