TL; DR Об этих двух зарегистрированных ошибках не о чем беспокоиться.
FlightRecorder записывает каждый бросок независимо от того, был ли он обработан или нет, и что еще хуже, он может записывать ошибки, которые только что были построены , независимо от того, были ли они фактически выброшены. Например, когда я использую следующую программу,
public class Test {
static NoSuchFieldError PREPARED = new NoSuchFieldError();
public static void main(String... args) {
}
}
FlightRecorder сообщает о следующем событии:
Class java.lang.NoSuchFieldError thrownClass class
Message message text
Event Thread main (thread) thread
Error.<init>() line: 59
LinkageError.<init>() line: 45
IncompatibleClassChangeError.<init>() line: 45
NoSuchFieldError.<init>() line: 47
Test.<clinit>() line: 3
, поэтому мы даже не можем предположить, что каждый сообщаемый объект throwable отражает реальную ошибку, кроме того, исключения, сгенерированные и обнаруженные в рамках типа java.lang.invoke
, не должны беспокоить нас.
В этом отношении обратите внимание, что в сообщаемом стековом трассировщике содержится MethodHandleImpl$Lazy.<clinit>()
, инициализатор класса внутреннего класса, инициализация которого была вызвана CallSite.<clinit>()
, инициализатором класса CallSite
, который не зависит от вашего фактического операция, за исключением того, что инструкция invokedynamic
, сгенерированная для лямбда-выражения, вызвала ее.
Когда мы используем
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class Test {
public static void main(String... args) {
MethodHandles.Lookup l = MethodHandles.lookup();
MethodType type = MethodType.methodType(void.class, String[].class);
try {
l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);
l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);
}
catch(ReflectiveOperationException ex) {
throw new RuntimeException(ex);
}
Runnable r = Test::main;
}
}
вместо этого мы получаем
Name Value Identifier Content Type Relational Key
Class java.lang.NoSuchFieldError thrownClass class
Message method resolution failed message text
Event Thread main (thread) thread
Error.<init>(String) line: 71
LinkageError.<init>(String) line: 55
IncompatibleClassChangeError.<init>(String) line: 55
NoSuchFieldError.<init>(String) line: 57
MethodHandleNatives.resolve(MemberName, Class)
MemberName$Factory.resolve(byte, MemberName, Class) line: 975
MemberName$Factory.resolveOrFail(byte, MemberName, Class, Class) line: 1000
MethodHandles$Lookup.resolveOrFail(byte, Class, String, MethodType) line: 1386
MethodHandles$Lookup.findStatic(Class, String, MethodType) line: 780
MethodHandleImpl.findCollector(String, int, Class, Class[]) line: 1387
MethodHandleImpl.makeFillArrays() line: 1488
MethodHandleImpl.access$100() line: 49
MethodHandleImpl$Lazy.<clinit>() line: 611
MethodHandleImpl.varargsArray(Class, int) line: 1638
MethodHandle.asCollector(Class, int) line: 999
Test.main(String[]) line: 9
(два идентичных события в течение миллисекунды)
, который демонстрирует, что фактический триггер инициализации класса действительно не имеет значения, так как мы получаем то же самое поведение для строки 9, l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);
, и это единовременная вещь инициализации, поскольку мы не получаем его для идентичного оператора на Следующая строка и ни одна из них не содержит ссылки на несколько строк ниже.