9

我刚开始用 Guava 代替 Google-Collections。Splitter 类看起来很酷。但是当我使用它时,像这样:

private static final Pattern p = Pattern.compile(" +");
private static final Splitter usSplitter = Splitter.on(p).trimResults();

我得到一个堆栈转储:

java.lang.NoSuchMethodError: com.google.common.base.Platform.precomputeCharMatcher(Lcom/google/common/base/CharMatcher;)Lcom/google/common/base/CharMatcher;
        at com.google.common.base.CharMatcher.precomputed(CharMatcher.java:662)
        at com.google.common.base.CharMatcher.<clinit>(CharMatcher.java:69)
        at com.google.common.base.Splitter.<init>(Splitter.java:99)
        at com.google.common.base.Splitter.on(Splitter.java:208)

javadocs 对这个“com.google.common.base.Platform”一无所知。所以有点难以猜测出了什么问题。

如您所见,Pattern 非常简单。

4

3 回答 3

14

告诉您当前运行时类路径java.lang.NoSuchMethodError中缺少所需的方法,而它在编译时类路径中。

换句话说,要解决这个问题,您需要调整运行时类路径,以便在编译时使用正确的 API 版本。它也可能是由于在整个运行时类路径中混合了不同版本的库引起的。然后清理类路径。

于 2010-06-27T04:49:39.657 回答
9

你用的是什么版本的番石榴?这对我来说非常适用于 r05。

编辑:这里的具体问题似乎是您在运行时类路径中同时拥有 google-collections 和 guava。Platform(一个内部类)存在于 google-collections 但没有该precomputedCharMatcher方法。Splitter正在从 guava jar 正确Platform加载,但正在从 google-collect jar 加载。

于 2010-06-27T03:56:32.440 回答
3

实际上。你有两个版本的com.google.common.base.Platform类,其中一个类有或没有方法。

尝试删除其中一个 jar 文件。我建议删除google-collections.jar并离开gauva.jar

它会正常工作。

于 2012-09-30T07:11:48.033 回答