2011-08-22 10 views
0

here이라는 자습서를 따랐으며 NullPointerException이 발생합니다. StackOverflow와 Google에서 가능한 해결책을 찾았지만 아무 소용이 없습니다. 아래에서 내 코드와 LogCat을 볼 수 있습니다. 이 문제를 해결하기 위해해야 ​​할 일에 대한 아이디어가 있습니까?NullPointerException XML을 파싱하는 동안

XMLParsingExample.java (NullPointerException을가 발생하는 선 (57) =)

package com.androidpeople.xml.parsing; 

import java.net.URL; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class XMLParsingExample extends Activity { 

    /** Create Object For SiteList Class */ 
    SitesList sitesList = null; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     /** Create a new layout to display the view */ 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(1); 

     /** Create a new textview array to display the results */ 
     TextView name[]; 
     TextView website[]; 
     TextView category[]; 

     try { 

      /** Handling XML */ 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 

      /** Send URL to parse XML Tags */ 
      URL sourceUrl = new URL(
        "http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml"); 

      /** Create handler to handle XML Tags (extends DefaultHandler) */ 
      MyXMLHandler myXMLHandler = new MyXMLHandler(); 
      xr.setContentHandler(myXMLHandler); 
      xr.parse(new InputSource(sourceUrl.openStream())); 

     } catch (Exception e) { 
      System.out.println("XML Pasing Excpetion = " + e); 
     } 

     /** Get result from MyXMLHandler SitlesList Object */ 
     sitesList = MyXMLHandler.sitesList; 

     /** Assign textview array length by arraylist size */ 
     name = new TextView[sitesList.getName().size()]; //NullPointerException Here 
     website = new TextView[sitesList.getName().size()]; 
     category = new TextView[sitesList.getName().size()]; 

     /** Set the result text in textview and add it to layout */ 
     for (int i = 0; i < sitesList.getName().size(); i++) { 
      name[i] = new TextView(this); 
      name[i].setText("Name = "+sitesList.getName().get(i)); 
      website[i] = new TextView(this); 
      website[i].setText("Website = "+sitesList.getWebsite().get(i)); 
      category[i] = new TextView(this); 
      category[i].setText("Website Category = "+sitesList.getCategory().get(i)); 

      layout.addView(name[i]); 
      layout.addView(website[i]); 
      layout.addView(category[i]); 
     } 

     /** Set the layout view to display */ 
     setContentView(layout); 
    } 
} 

MyXMLHandler.java :

package com.androidpeople.xml.parsing; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class MyXMLHandler extends DefaultHandler { 

    Boolean currentElement = false; 
    String currentValue = null; 
    public static SitesList sitesList = null; 

    public static SitesList getSitesList() { 
     return sitesList; 
    } 

    public static void setSitesList(SitesList sitesList) { 
     MyXMLHandler.sitesList = sitesList; 
    } 

    /** Called when tag starts (ex:- <name>AndroidPeople</name> 
    * -- <name>)*/ 
    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 

     currentElement = true; 

     if (localName.equals("maintag")) 
     { 
      /** Start */ 
      sitesList = new SitesList(); 
     } else if (localName.equals("website")) { 
      /** Get attribute value */ 
      String attr = attributes.getValue("category"); 
      sitesList.setCategory(attr); 
     } 

    } 

    /** Called when tag closing (ex:- <name>AndroidPeople</name> 
    * -- </name>)*/ 
    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 

     currentElement = false; 

     /** set value */ 
     if (localName.equalsIgnoreCase("name")) 
      sitesList.setName(currentValue); 
     else if (localName.equalsIgnoreCase("website")) 
      sitesList.setWebsite(currentValue); 

    } 

    /** Called to get tag characters (ex:- <name>AndroidPeople</name> 
    * -- to get AndroidPeople Character) */ 
    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException { 

     if (currentElement) { 
      currentValue = new String(ch, start, length); 
      currentElement = false; 
     } 

    } 

} 

SitesList.java :

package com.androidpeople.xml.parsing; 

import java.util.ArrayList; 

    /** Contains getter and setter method for varialbles */ 
    public class SitesList { 

     /** Variables */ 
     private ArrayList<String> name = new ArrayList<String>(); 
     private ArrayList<String> website = new ArrayList<String>(); 
     private ArrayList<String> category = new ArrayList<String>(); 

     /** In Setter method default it will return arraylist 
     * change that to add */ 

     public ArrayList<String> getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name.add(name); 
     } 

     public ArrayList<String> getWebsite() { 
      return website; 
     } 

     public void setWebsite(String website) { 
      this.website.add(website); 
     } 

     public ArrayList<String> getCategory() { 
      return category; 
     } 

     public void setCategory(String category) { 
      this.category.add(category); 
     } 

} 

AndroidParsing 매니페스트 :

012 365,

로그 캣 :

08-22 08:43:18.340: ERROR/AndroidRuntime(308): FATAL EXCEPTION: main 
08-22 08:43:18.340: ERROR/AndroidRuntime(308): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidpeople.xml.parsing/com.androidpeople.xml.parsing.XMLParsingExample}: java.lang.NullPointerException 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.os.Looper.loop(Looper.java:123) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at dalvik.system.NativeStart.main(Native Method) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308): Caused by: java.lang.NullPointerException 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at com.androidpeople.xml.parsing.XMLParsingExample.onCreate(XMLParsingExample.java:57) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
08-22 08:43:18.340: ERROR/AndroidRuntime(308):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

답변

0

확인이 한 번을. 여기 예제가 있습니다. http://androidcodesnips.blogspot.com/2011/04/sax-parsing.html

+0

이것은 다소 혼란 스럽습니다. 첫 번째 스 니펫에 대한 코드를 어디에 두어야할지 알려주지 않습니다. – Mxyk

+0

나는 완전한 소스 코드가 필요하다고 생각한다. 원하는 경우 해당 URL에 대한 구문 분석에 대한 완전한 예제를 제공합니다. – harish

+0

할 수 있으면, 그것은 굉장 할 것입니다. – Mxyk

0

SITELIST이 핸들러에서 null입니다. 당신이 라인을 통해 통과 여부를 확인하기 위해 프로그램을 추적 :

if (localName.equals("maintag")) 
    { 
     /** Start */ 
     sitesList = new SitesList(); 
    } 

감사합니다, 스테판

+0

이렇게 초보자에게는 죄송합니다. 어떻게해야합니까? 내가 아는 유일한 '추적'은 LogCat을보고 있습니다. – Mxyk

+0

System.out.println ("inside if") – Snicolas

관련 문제