【问题标题】:new WebView() causes "java.lang.UnsupportedOperationException: not implemented"new WebView() 导致“java.lang.UnsupportedOperationException:未实现”
【发布时间】:2018-12-24 03:43:30
【问题描述】:

我无法以编程方式创建新的 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。

【问题讨论】:

    标签: java javafx javafx-11


    【解决方案1】:

    更新:

    如 cmets 中所述,此错误将在 OpenJFX 12 中修复。


    这是来自com.sun.javafx.logging.PlatformLogger的问题代码:

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

    如您所见,它只会抛出观察到的异常。所有“已实现的”java.lang.System.Logger 方法都是如此。

    如果您按照您提供的堆栈跟踪所概述的代码进行操作,则最终会调用 getName 方法,因为在初始化 WebEngine 的过程中实例化了 com.sun.webkit.perf.PerfLogger,并且扩展为 com.sun.webkit.Invoker类。但是,getName 仅在启用 PerfLogger 时才会调用。

    粗略一看,PerfLogger 包裹了 com.sun.javafx.logging.PlatformLogger,而 com.sun.javafx.logging.PlatformLogger 本身包裹了 System.Logger。如果 System.Logger 在构造 PerfLogger 时为 isLoggable(System.Logger.Level.FINE) 返回 true,则启用 PerfLogger

    在这种情况下,此过程会创建一个名为 "com.sun.webkit.perf.Locks"System.Logger。这意味着您可以避免使用UnsupportedOperationException,如果您将此System.Logger 配置为不在Level.FINE 或“较低”处记录任何内容。这样做会使PerfLogger“禁用”,从而防止getName被调用。

    注意:这是基于 OpenJFX 11.0.1 的源代码。提及的所有内容都是实施细节,如有更改,恕不另行通知。

    【讨论】:

    • 很好的调查。你是对的,事实证明我将logging.properties 中的默认日志记录级别设置为.level = ALL。添加以下两行解决了这个问题:com.sun.webkit.perf.Locks.level = OFFcom.sun.webkit.perf.WCFontPerfLogger.level = OFF.
    • 这个问题现在已经修复,OpenJFX 12 不会有这个错误。
    • 这个问题已经被github.com/javafxports/openjdk-jfx/pull/343修复了
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 2021-10-25
    • 2011-09-08
    • 2011-11-01
    • 1970-01-01
    • 2023-03-15
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多