Splitter在简单模式上爆炸

时间:2010-06-27 03:19:56

标签: java guava

我刚刚开始使用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”一无所知。所以有点难以猜出出了什么问题。

正如你所看到的,模式很简单。

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:8)

您使用的是什么版本的番石榴?对于r05,这对我来说非常好。

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

答案 2 :(得分:3)

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

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

它会正常工作。