android - Null Pointer Exception: setinput function for Xmlpullparser assigning null value with StringReader -
i'm having problem parser assigning null value when object field checked (feed variable) not null. code below. appreciated.
line causing error is: xpp.setinput( new stringreader ( mworditem.getfeed()) );
package com.example.wffd; import android.os.bundle; import android.os.asynctask; import android.app.activity; import android.view.view; import android.widget.button; import android.widget.textview; import android.view.menu; import java.io.bufferedinputstream; import java.io.ioexception; import java.io.inputstream; import java.io.bufferedreader; import java.io.inputstreamreader; import java.io.stringreader; import java.net.url; import java.net.httpurlconnection; import org.xmlpull.v1.xmlpullparser; import org.xmlpull.v1.xmlpullparserexception; import org.xmlpull.v1.xmlpullparserfactory; public class wffdhomeactivity extends activity { button updatebutton; textview wdtextview, cwtextview; worditem myworditem ; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_wffdhome); updatebutton = (button)findviewbyid(r.id.button1); wdtextview = (textview)findviewbyid(r.id.textview2); cwtextview = (textview)findviewbyid(r.id.textview3); myworditem= new worditem(); updatebutton.setonclicklistener(new view.onclicklistener() { public void onclick(view view) { try { url url = new url("http://www.dictionary.reference.com/wordoftheday/wotd.rss"); httpurlconnection urlconnection = (httpurlconnection) url.openconnection(); new feedgrab(myworditem).execute(urlconnection); update_screen(myworditem); cwtextview.settext(myworditem.getword()); wdtextview.settext(myworditem.getdefinition()); } catch (xmlpullparserexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } }); } private class feedgrab extends asynctask<httpurlconnection,void,boolean>{ worditem aworditem; public feedgrab( worditem mworditem){ this.aworditem=mworditem; } protected boolean doinbackground(httpurlconnection... urls) { try { inputstream in = new bufferedinputstream(urls[0].getinputstream()); aworditem.setfeed(readstream(in)); } catch(ioexception e) { e.printstacktrace(); } { urls[0].disconnect(); } return true; } private string readstream(inputstream is) throws ioexception { stringbuilder sb = new stringbuilder(); bufferedreader r = new bufferedreader(new inputstreamreader(is),1000); (string line = r.readline(); line != null; line =r.readline()){ sb.append(line); } is.close(); return sb.tostring(); } } public void update_screen( worditem mworditem)throws xmlpullparserexception, ioexception { xmlpullparserfactory factory = xmlpullparserfactory.newinstance(); factory.setnamespaceaware(true); xmlpullparser xpp = factory.newpullparser(); xpp.setinput( new stringreader ( mworditem.getfeed()) ); int eventtype = xpp.geteventtype(); string tag_id="item"; boolean in_item = false,in_description = false; string tag_def="description"; while (eventtype != xmlpullparser.end_document) { if((eventtype == xmlpullparser.start_tag) ) { if(tag_id.equalsignorecase(xpp.getname())) { in_item = true; }else if(tag_def.equalsignorecase(xpp.getname())) { in_description= true; } } else if(eventtype == xmlpullparser.end_tag) { system.out.println("end tag "+xpp.getname()); } else if((eventtype == xmlpullparser.text ) &&(in_description & in_item)) { mworditem.processstring(xpp.gettext()); in_description=false; in_item = false; } eventtype = xpp.next(); } system.out.println("end document"); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.wffdhome, menu); return true; } }
worditemclass:
package com.example.wffd; public class worditem { private string word; private string definition; private string feed; public string getfeed() { return feed; } public void setfeed(string feed) { this.feed = feed; } public string getword() { return word; } public void setword(string word) { this.word = word; } public string getdefinition() { return definition; } public void setdefinition(string definition) { this.definition = definition; } public void processstring(string text){ string[] phrase = text.split(":"); this.setword(phrase[0]); this.setdefinition(phrase[1]); } }
edit: not sure if stack trace.. here:
thread [<1> main] (suspended (exception nullpointerexception)) <vm not provide monitor information> wffdhomeactivity.update_screen(worditem) line: 110 wffdhomeactivity$1.onclick(view) line: 51 button(view).performclick() line: 4204 view$performclick.run() line: 17355 handler.handlecallback(message) line: 725 viewrootimpl$viewroothandler(handler).dispatchmessage(message) line: 92 looper.loop() line: 137 activitythread.main(string[]) line: 5041 method.invokenative(object, object[], class, class[], class, int, boolean) line: not available [native method] method.invoke(object, object...) line: 511 zygoteinit$methodandargscaller.run() line: 793 zygoteinit.main(string[]) line: 560
**update: using debugger mworditem.getfeed() returning null yet feed string contains data. not sure what's going on here
**update @andy256:i thought using aworditem reference myworditem , modifying feed variable had solved problem apparently that's not did. how pass value async thread? tried passing value through onpostexecute no success.
protected void onpostexecute(worditem result) {
this.aworditem=result; return; }
the stack trace shows
wffdhomeactivity.update_screen(worditem) line: 110
wffdhomeactivity$1.onclick(view) line: 51
so on line 110 null
:
xpp.setinput( new stringreader ( mworditem.getfeed()) );
since xpp
seems set, @ mworditem
. comes call @ line 51, myworditem
passed. in code posted, myworditem
never set.
so, code have posted: myworditem
null
.