使用com.google.common.base.Splitter时出现NoSuchMethodError异常

时间:2011-11-24 13:04:32

标签: java guava splitter

我正在尝试使用com.google.common.base.Splitter,如下所示

Iterable<String> segs = Splitter.on("/").split("one/two/three/four/five");

for (String seg : segs) {
  System.out.println(seg);
}

但是,我看到以下异常:

Exception in thread "main" 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:664)
    at com.google.common.base.CharMatcher.<clinit>(CharMatcher.java:71)
    at com.google.common.base.Splitter.<init>(Splitter.java:107)
    at com.google.common.base.Splitter.on(Splitter.java:171)
    at Test.main(Test.java:30)

有谁知道我在这里做错了什么?

7 个答案:

答案 0 :(得分:10)

我遇到了同样的问题。 事实证明我使用了旧版番石榴。 访问此网站:https://code.google.com/p/guava-libraries/,并下载更新版本。

顺便说一下,google-collections被重命名为Guava。

答案 1 :(得分:8)

  

使用以下依赖项来解决问题

要使用Maven添加对Guava的依赖关系,请使用以下命令:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>19.0</version>
</dependency>

使用Gradle添加依赖关系:

dependencies {
  compile 'com.google.guava:guava:19.0'
}

答案 2 :(得分:2)

您的问题是另一个库可能还包含一个guava库,它首先从您的类路径而不是您想要的版本加载。这会导致此运行时异常。

答案 3 :(得分:0)

发生这种情况的另一个原因是如果在Guava库之前导入了GSON库。

请参阅: https://github.com/google/guava/issues/2786

我将jar从一个文件夹导入IntelliJ。最终工作的是在gson旁边添加一个“z”(因此jar将命名为zgson),以便Guava首先导入。

答案 4 :(得分:0)

对我来说,当您有一个依赖于Guava早期版本的依赖项时,就会发生这种情况,并且该依赖项会首先列出。番石榴将在第一个被发现的地方解决,而忽略其余部分。

解决方法是先添加对番石榴的依赖关系,但要注意不要破坏其他使用番石榴的项目

答案 5 :(得分:0)

有2个版本:1)com.google.guava:guava:26.0-android 2)com.google.guava:guava:26.0-jre。很可能您为我指定了错误的版本

答案 6 :(得分:-2)

是的,这只是番石榴库的问题。保留更新的库并删除所有剩余版本的番石榴(如果有)并尝试。应该工作正常。