java.nio.Buffer没有在运行时加载clear()方法

时间:2018-02-08 19:52:05

标签: java buffer nio

所以我是一个使用java代理注入的项目的开发人员。应该注意的是,在调用main之后会发生此错误。

对于大多数用户来说,一切都很顺利,但是有一些问题是java.nio.IntBuffer没有加载clear()(继承自Buffer)

错误:

java.lang.NoSuchMethodError: java.nio.IntBuffer.clear()Ljava/nio/IntBuffer;

然后在我们的代码中调用stacktrace,它简单地给出了第一次clear()。

原因是什么(除了Java在运行时没有加载的事实)以及如何修复它?

2 个答案:

答案 0 :(得分:4)

感谢Janez Kuhar的评论并进行了一些挖掘,这是由JDK9破坏兼容性引起的。在我们的代码中,我们调用IntBuffer.clear()并期望它返回Buffer,但在JDK9中,它们使所有Buffer方法返回子类型(即ByteBuffer或IntBuffer而不是Buffer),因此运行JRE8的人(我们的大多数用户库) )遇到NoSuchMethodError,因为返回类型不兼容,必须像这样输入

someMethod(((Buffer)intBuffer).clear());

答案 1 :(得分:0)

这是对 NoSuchMethodError 的一个很好的解释。

https://www.codenong.com/js8f219d981aa9/

注意:flip() 方法也有这个问题。

如果您使用 jdk9+ 编译并在 jdk8 上运行,则需要强制转换。 在我的项目中,我为此问题创建了 2 个实用方法:

  public static void clear(Buffer buffer)
  {
      buffer.clear();
  }

  public static void flip(Buffer buffer)
  {
      buffer.flip();
  }