Как метод может существовать в одной части программы, а не в другой? - PullRequest
0 голосов
/ 25 октября 2018

Основной вопрос / TLDR: я получаю NoSuchMethodError для метода на несколько уровней ниже в моем стеке вызовов.Но вызов метода в моей собственной главной функции в том же проекте не дает ошибок.Как это может случиться?Какими методами я мог бы попытаться сузить источник такой ошибки?

Другие факты: Документация показывает, что метод существует.Источник, из которого возникла ошибка, импортирует права и пытается вызвать метод.После распечатки ошибки в имени метода есть какая-то странная болтовня.Может ли это быть проблемой?

Специальная информация для моего случая:

Полная распечатка ошибки:

Exception in thread "main" java.lang.NoSuchMethodError: java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;
at it.unimi.dsi.sux4j.io.ChunkedHashStore.reset(ChunkedHashStore.java:526)
at it.unimi.dsi.sux4j.mph.GOVMinimalPerfectHashFunction.<init>(GOVMinimalPerfectHashFunction.java:335)
at it.unimi.dsi.sux4j.mph.GOVMinimalPerfectHashFunction$Builder.build(GOVMinimalPerfectHashFunction.java:270)
at org.boydwebb.familysearch.runners.examples.ManyGraphWriter.<init>(ManyGraphWriter.java:109)
at org.boydwebb.familysearch.runners.examples.ManyGraphWriter.main(ManyGraphWriter.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139)
at org.boydwebb.familysearch.runner.Runner.run(Runner.java:62)
at org.boydwebb.familysearch.runner.Runner.main(Runner.java:23)

Соответствующий источник: (https://raw.githubusercontent.com/vigna/Sux4J/master/src/it/unimi/dsi/sux4j/io/ChunkedHashStore.java)

Строки, которые я вставил в main, чтобы попытаться получить минимальный рабочий пример:

ByteBuffer buffer = ByteBuffer.allocateDirect(100);
buffer.clear();

Строки в моем исходном коде привели к ошибке:

import it.unimi.dsi.sux4j.mph.GOVMinimalPerfectHashFunction;
Long[] table = \*initialize here*\
TransformationStrategy<Long> transformationStrategy = TransformationStrategies.fixedLong();
GOVMinimalPerfectHashFunction.Builder<Long> builder = new GOVMinimalPerfectHashFunction.Builder<>();
builder.keys(Arrays.asList(table));
builder.transform(transformationStrategy);
builder.store(null);
builder.tempDir(null);
builder.signed(0);
toGiantIdx = builder.build();//ERROR HERE

1 Ответ

0 голосов
/ 30 октября 2018

Байт-код предварительно скомпилированной библиотеки содержит ссылку на метод, названный внутренне как java.nio.ByteBuffer.clear()Ljava/nio/ByteBuffer;, что означает метод, определенный в java.nio.ByteBuffer (может быть переопределен в производном классе) с объявлением

java.nio.ByteBuffer clear();

Этот запрошенный метод существуетначиная с Java SE 9. Если код выполняется с более старой средой выполнения Java, эта ошибка произойдет.

Если ваш собственный код скомпилирован с более старой версией JDK, компилятор разрешает buffer.clear() указывать на java.nio.Buffer java.nio.Buffer.clear() метод вместо (который существует с JDK 1.4).

...