我刚刚开始使用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”一无所知。所以有点难以猜出出了什么问题。
正如你所看到的,模式很简单。
答案 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
。
它会正常工作。