当前位置: 首页 > 知识库问答 >
问题:

处理代码中没有发生的异常时,我应该怎么做?

宁浩博
2023-03-14

我有一个JavaFX应用程序,可以拍摄节点的屏幕截图/快照。截图的代码如下所示:

WritableImage image = webView.snapshot(null, null);

其中webView是一个javafx.scene.web.WebView。通常情况下,这很正常,但是当WebView太大时(我的意思是,在10240x5548像素的顺序上),我得到了这个异常:

java.lang.NullPointerException
    at com.sun.prism.impl.ps.BaseShaderContext.initLCDBuffer(BaseShaderContext.java:703)
    at com.sun.prism.impl.ps.BaseShaderContext.validateLCDBuffer(BaseShaderContext.java:725)
    at com.sun.prism.impl.ps.BaseShaderGraphics.initLCDSampleRT(BaseShaderGraphics.java:1925)
    at com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2056)
    at com.sun.javafx.webkit.prism.WCGraphicsPrismContext$10.doPaint(WCGraphicsPrismContext.java:936)
    at com.sun.javafx.webkit.prism.WCGraphicsPrismContext$Composite.paint(WCGraphicsPrismContext.java:1500)
    at com.sun.javafx.webkit.prism.WCGraphicsPrismContext$Composite.paint(WCGraphicsPrismContext.java:1485)
    at com.sun.javafx.webkit.prism.WCGraphicsPrismContext.drawString(WCGraphicsPrismContext.java:948)
    at com.sun.webkit.graphics.GraphicsDecoder.decode(GraphicsDecoder.java:299)
    at com.sun.webkit.graphics.WCRenderQueue.decode(WCRenderQueue.java:92)
    at com.sun.webkit.WebPage.paint2GC(WebPage.java:734)
    at com.sun.webkit.WebPage.paint(WebPage.java:701)
    at com.sun.javafx.sg.prism.web.NGWebView.renderContent(NGWebView.java:96)
    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.QuantumToolkit$5.draw(QuantumToolkit.java:1393)
    at com.sun.javafx.tk.quantum.QuantumToolkit$5.run(QuantumToolkit.java:1429)
    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:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
    at java.lang.Thread.run(Thread.java:748)

这种情况并不常见,但我仍然希望处理这种情况,即使只是告诉用户不支持这种解决方案。问题是堆栈跟踪根本不涉及我的代码。我的代码中没有一行。我猜这是一个由我调用的东西触发的线程,它会在线程崩溃后立即返回。

我的应用程序已经是多线程的,因此,我有一个通用的错误处理程序,如下所示:

public class ErrorHandler implements Thread.UncaughtExceptionHandler {
    public ErrorHandler(String appName) {
        super();
        // init stuff.
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        // Oh my! something went wrong.
        e.printStackTrace(); // We still want to see the exception, specially while developing.
    }
}

我的应用程序启动后立即设置如下:

ErrorHandler errorHandler = new ErrorHandler(APP_NAME);
Thread.setDefaultUncaughtExceptionHandler(errorHandler);

这往往有效,但由于某种原因,它不适用于该线程。

有什么想法我怎样才能抓住这种情况做些什么呢?

注意:我发布了一个相关的问题,在这个问题中,我实际上从生产中获得了异常报告,看起来像一个大截图,但是我无法触发该异常,而是触发了这个异常。这个问题在这里:如何解决JavaFX中无法识别的图像加载器:null?

我努力想弄清楚到底发生了什么,最终我把这件事告诉了斯特尔:

Outstanding resource locks detected:
D3D Vram Pool: 402,867,712 used (75.0%), 500,823,400 target (93.3%), 536,870,912 max
21 total resources being managed
average resource age is 37.2 frames
0 resources at maximum supported age (0.0%)
11 resources marked permanent (52.4%)
5 resources have had mismatched locks (23.8%)
5 resources locked (23.8%)
12 resources contain interesting data (57.1%)
0 resources disappeared (0.0%)

我不确定那里发生了什么,但可能有关联。

共有1个答案

巩光誉
2023-03-14

您可以在执行快照之前引入一个简单的验证。

if (webView.getHeight() > 1000 || webView.getWidth() > 1000){
    throw new Exception("Web view dimension too big for capturing a snapshot!");
}
WritableImage writImage = webView.snapshot(null, null);

如果您不想硬编码webView可以具有的最大值,您可以只获取当前屏幕边界并与它们进行比较。

Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
if (webView.getHeight() > primaryScreenBounds.getHeight() || webView.getWidth() > primaryScreenBounds.getWidth()){
    throw new Exception("Webview exceeds screen dimensions!");
}
 类似资料:
  • 我使用Selenium编写了Java代码。当我运行代码时,它会抛出NullPointerException。检查下面的异常 我的代码如下:

  • 问题内容: 我已经使用Selenium用Java编写了代码。当我运行代码时,它将引发NullPointerException。检查以下异常 我的代码如下: 问题答案: 您会看到一个原因,因为您从一开始就尝试访问该方法,这需要in的活动实例,即to &and perform 方法。 解决方案是先访问该方法,以便您拥有and 的活动实例。接下来,您可以访问方法。 这是您的工作代码块:

  • asyncio文档明确指出,asyncio代码不应直接调用阻塞代码,还指定了使用异步代码运行阻塞代码的方法: 不应直接调用阻塞(CPU绑定)代码。例如,如果函数执行CPU密集型计算1秒,则所有并发异步IO任务和IO操作将延迟1秒。 可以使用执行器在不同的线程中甚至在不同的进程中运行任务,以避免事件循环阻塞OS线程。 然而,这个描述对于在什么时候应该使用执行器不是很具体。很明显,“1秒钟的CPU密集

  • 我搜索了很多,几乎所有我发现的例子都使用了控制器中的异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。 另外,如果我在Controller中实现异常处理,是否意味着我必须在前面的所有层中抛出异常?

  • 我有一个spring-boot应用程序,没有任何控制器类。如何为该应用程序编写异常处理程序。用@ControllerAdvice注释的异常处理程序类不起作用。

  • 我正在为一个网站设计后端,该网站使用应用编程接口网关和Lambda来处理应用编程接口请求,其中许多请求针对RDS上的MySQL数据库。有些过程需要异步进行,但我正在争论哪个是最佳实践还是更干净。 在给定的场景中,每次用户在某个表中创建新行时,都需要异步发送电子邮件。还有许多其他类似的情况,但这将成为先例。 选项1:在处理API请求的lambda中,首先写入MySQL实例以添加新行。当来自MySQL