пытаясь запустить тестовый пример через IntelliJ Idea, но я получаю java.lang.nosuchmethoderror [duplicate]

Да, это устарело! Вот некоторые моменты, которые вам понадобятся при использовании нового FusedLocationProviderClient .

  1. импортировать его как import com.google.android.gms.location.FusedLocationProviderClient;

62
задан wattostudios 6 May 2012 в 04:45
поделиться

2 ответа

Что означает «ILcom» или «Z»?

Это типы отображения для собственных типов. Вы можете найти обзор здесь .

Native Type    | Java Language Type | Description      | Type signature
---------------+--------------------+------------------+----------------
unsigned char  | jboolean           | unsigned 8 bits  | Z
signed char    | jbyte              | signed 8 bits    | B
unsigned short | jchar              | unsigned 16 bits | C
short          | jshort             | signed 16 bits   | S
long           | jint               | signed 32 bits   | I
long long      | jlong              | signed 64 bits   | J
__int64        |                    |                  |
float          | jfloat             | 32 bits          | F
double         | jdouble            | 64 bits          | D

Кроме того, подпись "L fully-qualified-class ;" будет означать класс, однозначно указанный этим именем; например, подпись "Ljava/lang/String;" относится к классу java.lang.String. Кроме того, префикс [ для подписи создает массив этого типа; например, [I означает тип массива int.


Что касается вашего следующего вопроса:

Почему существует четыре типа в скобках (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / String; Z) и один после круглых скобок Ljava / lang / String; когда метод printDocLinkForMenu явно имеет пять параметров?

Поскольку вы не используете код, который, по вашему мнению, работает. Фактически исполняемый код пытается вызвать именно этот метод, описанный в сообщении об ошибке, фактически на самом деле пять параметров (значение I должно учитываться отдельно) и возвращаемый тип String, но этот метод не работает 't существует в пути к среде выполнения (пока он был доступен в пути класса compiletime), следовательно, эта ошибка. Также см. NoSuchMethodError javadoc :

Брошено, если приложение пытается вызвать указанный метод класса (статический или экземпляр), а этот класс больше не имеет определение этого метода.

Обычно эта ошибка улавливается компилятором; эта ошибка может возникнуть только во время выполнения, если определение класса несовместимо изменилось.

Итак, проверьте, действительно ли вы используете правильную версию кода, как вы разместили в своем вопросе, и используете правильные зависимости в пути к среде выполнения и не дублируете разные версии библиотеки в пути к классам.

Обновление: исключение означает, что фактический код (неявно) пытается использовать метод следующим образом:

String s = printDocLinkForMenu(context, cd, (MemberDoc) emd, name, false);

Потому что он ожидает результата String, пока он объявлен void.

16
ответ дан BalusC 26 August 2018 в 06:28
поделиться

Из раздела 4.3.2 JVM Spec:

Character     Type          Interpretation
------------------------------------------
B             byte          signed byte
C             char          Unicode character
D             double        double-precision floating-point value
F             float         single-precision floating-point value
I             int           integer
J             long          long integer
L<classname>; reference     an instance of class 
S             short         signed short
Z             boolean       true or false
[             reference     one array dimension

Из раздела 4.3.3, дескрипторы метода :

Дескриптор метода представляет параметры, которые принимает метод, и возвращаемое им значение:

MethodDescriptor:
        ( ParameterDescriptor* ) ReturnDescriptor

Таким образом,

(ILcom/sun/javadoc/ClassDoc;Lcom/sun/javadoc/MemberDoc;Ljava/lang/String;Z) Ljava/lang/String;

переводит на:

Метод с параметрами int, ClassDoc, MemberDoc, String и boolean в качестве параметров и который возвращает a String. Обратите внимание, что только опорные параметры разделяются точкой с запятой, так как точка с запятой является частью их символьного представления.


Итак, подытожим:

Почему четыре типа в круглых скобках (ILcom / sun / javadoc / ClassDoc; Lcom / sun / javadoc / MemberDoc; Ljava / lang / String; Z) и один после круглых скобок Ljava / lang / String; когда метод printDocLinkForMenu явно имеет пять параметров?

Существует пять параметров (int, ClassDoc, MemberDoc, String, boolean) и один возвращаемый тип (String).

80
ответ дан Pops 26 August 2018 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: