gpt4 book ai didi

java - NPE 在 NodeList 上调用 getLength()

转载 作者:数据小太阳 更新时间:2023-10-29 02:40:08 29 4
gpt4 key购买 nike

我正在使用 org.w3c.dom.Document 接口(interface)来解析在客户端和服务器之间传递的 XML 消息。我间歇性地遇到了一个我无法解释的 NPE。

事件链如下:客户端在单独的(非 AWT)线程中向服务器发送消息。响应被捕获为字符串,转换为文档对象,此时获取根元素:

Element root = response.getDocumentElement();

然后这个根元素被传递到排行榜屏幕,因此:

Leaderboard leaderboard = ScreenCache.getLeaderboard();
if (!leaderboard.isVisible())
{
return;
}

leaderboard.buildTablesFromResponseLater(root);

然后我调用 AWT 线程,因为我将使用数据以各种方式重新绘制屏幕(更新表格等),而 Swing 不是线程安全的。我还在某处读到 DOM 内容不是线程安全的(尽管我现在再也找不到了)。

public void buildTablesFromResponseLater(final Element root)
{
Runnable updateRunnable = new Runnable()
{
@Override
public void run()
{
buildTablesFromResponse(root);
}
};

SwingUtilities.invokeLater(updateRunnable);
}

在 buildTablesFromResponse 中,我开始解析 XML。我从中获取各种属性,然后调用以下代码:

NodeList children = root.getElementsByTagName(TAG_ROOM_STATS);
int length = children.getLength(); <- NPE HERE

但是,这会产生如下所示的 NPE:

10/05 23:44:14.505   java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.nextMatchingElementAfter(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.item(Unknown Source)
at com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.getLength(Unknown Source)
at online.screen.g.d(Leaderboard.java:370)
at online.screen.g.c(Leaderboard.java:364)
at online.screen.g.b(Leaderboard.java:315)
at online.screen.g.a(Leaderboard.java:312)
at online.screen.g$4.run(Leaderboard.java:305)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

我看不出我做错了什么。还有很多其他地方我像这样解析 XML,它工作正常,正如我所说,即使在排行榜中,这个问题也很少见。我能想到的唯一区别是:

  • 排行榜消息可能比其他消息“更庞大”。
  • 其他地方几乎肯定会在打开套接字的同一个线程中获取 NodeList/length,这将是一个非 AWT 线程。但是,我原以为这会更容易出现问题,而不是更少!

如果 AWT 线程以某种方式出现问题,那么在回调 AWT 线程绘制屏幕之前解析 XML 是一种快速解决方法。如果没有正确理解根本问题,我只是不愿意这样做。

最佳答案

显然这是一个非常古老的话题,但以防其他人遇到过这个问题......我最近自己也遇到了这个问题,经过一些研究后我能找到的唯一建议是这是因为解析仍在进行当调用访问器时。所以我想,为了简要总结我发现的内容,是的,您应该在回调之前完全完成 XML 解析。

来自这个线程(https://community.oracle.com/thread/2114086):

This is happening because JAXP is not thread safe. need to synchronize bracket or use thread safe parser.

关于java - NPE 在 NodeList 上调用 getLength(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174504/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com