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

代码在JavaSE中工作,但在Wildfly中崩溃,出现NullPointerException

皮嘉德
2023-03-14

我正在使用gephi-toolkit(0.9.1)生成图,编写一个javaSE应用程序,并对其进行测试,等等。

当将此代码复制粘贴到我的EJB(尝试了所有三种类型)时,代码开始生成:

runtimeException:java.lang.NullPointerException

将图形导出到SVG(也可以导出PNG)。

我显式检查我的对象-它们不是空的。因此,gephi-toolkit的一些深层内容与JavaSE兼容,而与JavaEE不兼容。

有什么提示或建议如何发现和解决问题?

我尝试导出到文件(File.createTempFile()),然后导出到流-StringWriterOutputStream。三人都失败了。

ExportController ec = Lookup.getDefault().lookup(ExportController.class);
SVGExporter exp = (SVGExporter) ec.getExporter("svg");
StringWriter sw = new StringWriter();
exp.setWriter(sw);
exp.setWorkspace(workspace);
System.out.println(" exec: " + exp.execute());

ecexpsw不为空,但我在exp.execute()上获得NPE

更新:

null

共有1个答案

邬安邦
2023-03-14

执行摘要:代码在桌面上工作,但在服务器上失败,因为服务器处于无头模式,并且代码在Batik中使用了一些需要GUI的功能(这里是getBbox())。

在一个简单的Java SE程序中运行的代码和在服务器环境中运行的相同代码之间的一个主要区别是后者很可能是无头的。

Gephi委托Batik生成SVG,而Batik使用java.awt来处理一些呈现细节,并且呈现(可能)是边界框计算(getBbox())所必需的,不幸的是,Gephi依赖于这种计算。

旧版本的蜡染过去常常在无头环境下崩溃。现在基本上都管用了。请参阅Batik源代码中的此示例:

/**
 * Returns the active screen resolution. If Batik is run in a headless environment, this
 * method will return the default "96" unlike {@link Toolkit#getScreenResolution()} which
 * will throw a {@link HeadlessException}.
 * @return the screen resolution in dpi
 */
public static int getScreenResolution() {
    if (GraphicsEnvironment.isHeadless()) {
        return 96;
    } else {
        return Toolkit.getDefaultToolkit().getScreenResolution();
    }
}

但在试图计算一个包围盒时,它似乎仍然是有限的。

因此,有一个建议值得尝试,如果可能的话(根据您的情况,它可能非常容易,也可能非常复杂):在非无头环境中启动服务器。

默认情况下,Wildfly(和大多数服务器)在命令行中使用-djava.awt.headless=true运行。应该可以通过编辑standalone.conf来更改。

要使其工作,您需要一个显示器。例如,在Linux上,给它一个有效的$display来使用,它将指向虚拟显示器,比如VNC服务器,或者更好地使用虚拟Framebuffer,它是一个“假”X服务器(避免在服务器上使用X-windows,CentOS包是xorg-x11-server-xvfb,Debian的是xvfb)。

对于生产来说,这可能不是一个令人满意的解决方案,但如果它有效的话,它至少是一个很好的线索,可以帮助确定下一步应该查看的位置:如何让getBbox()在无头环境中工作,或者让gephi在不需要getBbox()的情况下工作。

 类似资料:
  • 下面是异常,它看起来像是在函数调用期间发生的。 有线索吗?

  • 问题内容: 就像我在标题中说的那样,我正在为iPhone编写一个应用程序,该应用程序可以在调试模式下完美运行,但是当我将其构建为发行版并通过TestFlight安装时,它会崩溃。由于崩溃日志,它可能必须使用以下代码行: 我使用的是Brother的框架而不使用AirPrint进行打印,但是我认为这不是问题,因为应用程序在对框架执行某些操作之前便崩溃了。它仅在我执行这些行的ViewController

  • 该应用程序在API26模拟器中运行良好,没有任何意外行为,但在API23中崩溃。当应用程序启动时。我对android相当陌生,所以不太确定要做什么改变来适应API23。 这是我的年级

  • 我在我的iOS应用程序中实现了Firebase Crashlytics。我遵循了firebase文档中的所有步骤。我已经在没有调试器的情况下运行了crashlytics,方法是先关闭应用程序,然后重新运行应用程序,以便发送崩溃报告。我甚至收到这个信息 崩溃上载提交成功 我甚至将Run脚本和set变量添加到“dwarf with dsym”

  • 我是计算机视觉新手,还没有真正学习过阈值、模糊或其他过滤器的教程。我使用下面两段代码找出图像中的轮廓。一方面,这种方法是有效的,但另一方面,它不是。我需要帮助理解发生这种情况的原因,以便说服自己背景中发生了什么。 工作代码段: 不工作的代码段 如果有人能找出这里发生的错误的原因,我将不胜感激。 我所面对的错误是: 回溯(最近一次调用last):文件“convexhull.py”,第27行,在im2

  • 我知道这里有一篇相同的文章,但没有一个建议的解决方案有任何改变,而且它们都很老(与Java6有关的问题),似乎指的是与Eclipse有关的bug。 我的问题是当我在Eclipse中为RCP和RAP开发人员开发时;对java文件进行更改或更改依赖项等,Eclipse都会随机挂起然后冻结。我必须强制关闭eclipse并且我得到了这个消息 到目前为止我尝试过的事情: null 尝试将新包添加到src文件