Новый WebView() вызывает "исключение java.lang.UnsupportedOperationException: не реализовано"

Я не могу создать новый WebView программно. Просто звоню new WebView() вызывает следующее исключение:

java.lang.ExceptionInInitializerError
    at javafx.web/javafx.scene.web.WebEngine.<clinit>(WebEngine.java:339)
    at javafx.web/javafx.scene.web.WebView.<init>(WebView.java:260)
    // omitting unrelated stacktraces
    at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventFilterRecord.handleCapturingEvent(CompositeEventHandler.java:282)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchCapturingEvent(CompositeEventHandler.java:98)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:223)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:180)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchCapturingEvent(CompositeEventDispatcher.java:43)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:52)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Scene$KeyHandler.process(Scene.java:4058)
    at javafx.graphics/javafx.scene.Scene$KeyHandler.access$1500(Scene.java:4004)
    at javafx.graphics/javafx.scene.Scene.processKeyEvent(Scene.java:2121)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2595)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$1(GlassViewEventHandler.java:248)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
    at javafx.graphics/com.sun.glass.ui.View.handleKeyEvent(View.java:547)
    at javafx.graphics/com.sun.glass.ui.View.notifyKey(View.java:971)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.UnsupportedOperationException: not implemented
    at javafx.base/com.sun.javafx.logging.PlatformLogger.getName(PlatformLogger.java:121)
    at javafx.web/com.sun.webkit.perf.PerfLogger.fullName(PerfLogger.java:155)
    at javafx.web/com.sun.webkit.perf.PerfLogger.registerProbe(PerfLogger.java:201)
    at javafx.web/com.sun.webkit.perf.PerfLogger.startCount(PerfLogger.java:227)
    at javafx.web/com.sun.webkit.perf.PerfLogger.<init>(PerfLogger.java:90)
    at javafx.web/com.sun.webkit.perf.PerfLogger.getLogger(PerfLogger.java:57)
    at javafx.web/com.sun.webkit.perf.PerfLogger.getLogger(PerfLogger.java:84)
    at javafx.web/com.sun.webkit.Invoker.<clinit>(Invoker.java:34)
    ... 37 more

Это ошибка? Я использую OpenJFX 11.0.1 и OpenJDK 11.0.1.

1 ответ

Решение

Обновления:

Как уже упоминалось в комментариях, эта ошибка будет исправлена ​​в OpenJFX 12.


Вот код проблемы от com.sun.javafx.logging.PlatformLogger:

@Override
public String getName() {
   throw new UnsupportedOperationException("not implemented");
}

Как видите, он ничего не делает, кроме как выдает наблюдаемое исключение. Это верно для всех "реализованных" java.lang.System.Logger методы.

Если вы будете следовать коду, как указано в приведенной вами трассировке стека, getName Метод вызывается в конечном итоге, потому что com.sun.webkit.perf.PerfLogger создается в процессе инициализации WebEngine и, соответственно, com.sun.webkit.Invoker классы. Тем не мение, getName вызывается только когда PerfLogger включен.

С беглого взгляда, PerfLogger оборачивает com.sun.javafx.logging.PlatformLogger который сам оборачивает System.Logger, PerfLogger включен, если System.Logger возвращает истину для isLoggable(System.Logger.Level.FINE) в то время PerfLogger построен

В этом случае этот процесс приводит к System.Logger с именем "com.sun.webkit.perf.Locks" создается Это означает, что вы можете избежать UnsupportedOperationException если вы настроите это System.Logger ничего не регистрировать на Level.FINE или "ниже". Это сделает PerfLogger "отключен", который предотвращает getName от вызова по линии.

Примечание. Это основано на исходном коде OpenJFX 11.0.1. Все упомянутое является деталью реализации и может быть изменено без уведомления.

Другие вопросы по тегам