java - NPE calling getLength() on NodeList -


i using org.w3c.dom.document interface parse xml messages passed between client , server. intermittently running npe can't explain.

the chain of events follows: client sends message server in separate (non-awt) thread. response captured string, converted document object @ point root element obtained:

element root = response.getdocumentelement(); 

this root element passed leaderboard screen, thus:

leaderboard leaderboard = screencache.getleaderboard(); if (!leaderboard.isvisible()) {     return; }  leaderboard.buildtablesfromresponselater(root); 

i invoke onto awt-thread, going using data repaint screen in various ways (update tables etc) , swing not thread-safe. have read somewhere dom stuff isn't thread-safe (though can't life of me find again now).

public void buildtablesfromresponselater(final element root) {     runnable updaterunnable = new runnable()     {         @override         public void run()         {             buildtablesfromresponse(root);         }     };      swingutilities.invokelater(updaterunnable); } 

inside buildtablesfromresponse, start parse xml. various attributes out of it, , call following code:

nodelist children = root.getelementsbytagname(tag_room_stats); int length = children.getlength(); <- npe here 

however, produces npe below:

10/05 23:44:14.505   java.lang.nullpointerexception     @ com.sun.org.apache.xerces.internal.dom.deepnodelistimpl.nextmatchingelementafter(unknown source)     @ com.sun.org.apache.xerces.internal.dom.deepnodelistimpl.item(unknown source)     @ com.sun.org.apache.xerces.internal.dom.deepnodelistimpl.getlength(unknown source)     @ online.screen.g.d(leaderboard.java:370)     @ online.screen.g.c(leaderboard.java:364)     @ online.screen.g.b(leaderboard.java:315)     @ online.screen.g.a(leaderboard.java:312)     @ online.screen.g$4.run(leaderboard.java:305)     @ java.awt.event.invocationevent.dispatch(unknown source)     @ java.awt.eventqueue.dispatcheventimpl(unknown source)     @ java.awt.eventqueue.access$400(unknown source)     @ java.awt.eventqueue$3.run(unknown source)     @ java.awt.eventqueue$3.run(unknown source)     @ java.security.accesscontroller.doprivileged(native method)     @ java.security.protectiondomain$1.dointersectionprivilege(unknown source)     @ java.awt.eventqueue.dispatchevent(unknown source)     @ java.awt.eventdispatchthread.pumponeeventforfilters(unknown source)     @ java.awt.eventdispatchthread.pumpeventsforfilter(unknown source)     @ java.awt.eventdispatchthread.pumpeventsforhierarchy(unknown source)     @ java.awt.eventdispatchthread.pumpevents(unknown source)     @ java.awt.eventdispatchthread.pumpevents(unknown source)     @ java.awt.eventdispatchthread.run(unknown source) 

i don't see i'm doing wrong here. there various other places parse xml , works fine, , said problem infrequent leaderboard. differences can think of are:

  • the leaderboard message 'bulkier' others.
  • other places nodelist/length in same thread opens socket, non-awt thread. however, would've thought more prone problems rather less!

if somehow awt thread problem it's quick fix parse xml before calling awt thread paint screen. reluctant without understanding underlying issue.

obviously old thread, incase else has run issue... ran issue myself , after research suggestion find is because parsing still occurring when accessors called. guess, briefly sum found, yes, should finish parsing xml before calling back.

from thread (https://community.oracle.com/thread/2114086):

this happening because jaxp not thread safe. need synchronize bracket or use thread safe parser.


Comments

Popular posts from this blog

IF statement in MySQL trigger -

c++ - What does MSC in "// appease MSC" comments mean? -

javascript - Blogger related post gadget image Resize s72-c [ Need Expert Help ] -