java - 如何捕获 JavaFx 中大型 Canvas 产生的异常?

标签 java canvas javafx

我们的应用程序使用 JavaFx Canvas。当用户放大太多时,会抛出以下异常:

java.lang.NullPointerException
at com.sun.javafx.sg.prism.NGCanvas$RenderBuf.validate(NGCanvas.java:213)
at com.sun.javafx.sg.prism.NGCanvas.initCanvas(NGCanvas.java:640)
at com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:603)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.renderForClip(NGNode.java:2294)
at com.sun.javafx.sg.prism.NGNode.renderRectClip(NGNode.java:2188)
at com.sun.javafx.sg.prism.NGNode.renderClip(NGNode.java:2214)
at com.sun.javafx.sg.prism.CacheFilter.impl_renderNodeToCache(CacheFilter.java:671)
at com.sun.javafx.sg.prism.CacheFilter.render(CacheFilter.java:575)
at com.sun.javafx.sg.prism.NGNode.renderCached(NGNode.java:2358)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2044)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:235)
at com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:576)
at com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2053)
at com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1945)
at com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:477)
at com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:323)
at com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:91)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)

我看过讨论here现在我们正在努力实现图 block ,但是有什么方法可以捕获此异常(例如,强制调整大小)?设置defaultExceptionHandler没有帮助。

最佳答案

com.sun.javafx.tk.quantum.QuantumRenderer(在 JavaFX 12.0.2 中)设置其自己的线程 uncaughtExceptionHandler。我的应用程序有一个 defaultUncaughtExceptionHandler,但线程的 uncaughtExceptionHandler 优先。此外,这个特定的异常是在 PresentingPainter try/catch block 中捕获的,其中堆栈跟踪被打印到 System.err。

即使您可以捕获此异常,我也不知道如何使用它从异常中恢复。我观察到,此错误情况会使渲染处于一种状态,即所有 future 的 JavaFX 渲染都会停止,直到 Canvas 的大小减小(例如缩小)回到适合可用 VRAM 的大小。最好的办法是防止 Canvas 调整大小条件导致失败。

关于java - 如何捕获 JavaFx 中大型 Canvas 产生的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975514/

相关文章:

java - 使用Weblogic 12c,给出警告警告日志管理BEA-170011该服务器上的LogBroadcaster未能

java - 如何阻止整数在每次运行时重置为原始值?

java - 初学者 Java 挑战

javascript - HTML5 Canvas 颜色

java - IE中的struts验证问题

javascript - 如何在两个分层 Canvas 的底部 Canvas 上注册单击事件

javascript - Ionic3 和 FabricJS

没有窗口的javafx图形

Java 用户界面框架?

java - 如何避免 JavaFX 投影效果覆盖在它旁边的按钮并且无法按下按钮?