【问题标题】:UUID.fromString() returns an invalid UUID?UUID.fromString() 返回无效的 UUID?
【发布时间】:2013-09-18 12:14:10
【问题描述】:

在我的 Android 应用程序中,我有一个采用 UUID 的方法。不幸的是,当我这样做时:

OverviewEvent overviewevent = eventAdapter.getOverviewEvent(UUID.fromString("0f14d0ab-9605-4a62-a9e4-5ed26688389b"));

我收到一条错误消息java.lang.IllegalArgumentException: Invalid UUID: 100

getOverviewEvent的实现如下:

public OverviewEvent getOverviewEvent(UUID uuid) throws Exception {
    // Do stuff
}

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 它在 Java 7 上运行良好,所以我怀疑是一个错误。
  • @PeterLawrey - 啊,是的,但是有什么错误?你的意思是在 Android 基础知识中,还是在我的程序中?
  • UUID.fromString()中,抛出异常的那个,不应该抛出。
  • 据我所见,它不应该打印“Invalid UUID: 100” ...您确定输入字符串吗?是否像您的问题一样硬编码?

标签: java android uuid illegalargumentexception


【解决方案1】:

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

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);

打印

0f14d0ab-9605-4a62-a9e4-5ed26688389b

【讨论】:

  • 嗨,彼得。 .. 请告诉我如何获得正确的 UUId
【解决方案2】:

你是不是复制粘贴了代码,我发现有几个看起来正确的字符实际上是错误的 ACSII 代码。

删除 - 并再次替换它们。

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

【讨论】:

    【解决方案3】:

    我也有这个问题。我认为这是因为我的 Java 版本低。我发现在我的 Android 应用程序中,uuid.split("-")uuid.replace("-") 都没有用。我猜这可能是由于Java将“-”视为正则表达式引起的。但是,当我尝试uuid.split("\\-")uuid.replace("\\-") 时,它们也不起作用。我不知道为什么会这样。我认为这是Java的错误。

    根据Fildor的评论,在Android的实现中,uuid.split("-")用于将uuid字符串拆分为5个部分。然后由于提到的错误,uuid字符串无法拼接成5部分。所以会抛出“Invalid UUID”异常。

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

    以下代码对我有用:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 1970-01-01
      • 2019-01-03
      • 2017-12-01
      • 2018-02-09
      • 2021-05-31
      • 2019-07-08
      • 2021-04-18
      • 2016-03-23
      相关资源
      最近更新 更多