2011-11-17 7 views
0

나는이 구문 분석을 시도하고 함께 문제를 구문 분석 :이 튜토리얼 Android XML Parsing Tutorial - Using SAXParser을 준수함으로써 xml's url
을, 나는 소스 코드를 수정하려하지만 난 다음 오류 얻을 :안드로이드는 XML 파일

11-17 20:04:38.072: I/System.out(13247): Error: null 
11-17 20:04:38.072: D/AndroidRuntime(13247): Shutting down VM 
11-17 20:04:38.082: W/dalvikvm(13247): threadid=1: thread exiting with uncaught exception (group=0x409951f8) 
11-17 20:04:38.122: E/AndroidRuntime(13247): FATAL EXCEPTION: main 
11-17 20:04:38.122: E/AndroidRuntime(13247): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.net46.sourcecode.android.lectorxml2/net.net46.sourcecode.android.lectorxml2.LectorXML2Activity}: java.lang.NullPointerException 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.os.Looper.loop(Looper.java:137) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread.main(ActivityThread.java:4340) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at java.lang.reflect.Method.invokeNative(Native Method) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at java.lang.reflect.Method.invoke(Method.java:511) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at dalvik.system.NativeStart.main(Native Method) 
11-17 20:04:38.122: E/AndroidRuntime(13247): Caused by: java.lang.NullPointerException 
11-17 20:04:38.122: E/AndroidRuntime(13247): at net.net46.sourcecode.android.lectorxml2.LectorXML2Activity.onCreate(LectorXML2Activity.java:36) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.Activity.performCreate(Activity.java:4465) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
11-17 20:04:38.122: E/AndroidRuntime(13247): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
11-17 20:04:38.122: E/AndroidRuntime(13247): ... 11 more 

그게 전부를 에뮬레이터가 실행되면 내 LogCat. 원래 혀에서 세 가지 수정 된 소스 코드 클래스는 지금 : 그래서

//Lista.java 
package net.net46.sourcecode.android.lectorxml2; 
import java.util.ArrayList; 
public class Lista { 
private ArrayList<String> nombre = new ArrayList<String>(); 
private ArrayList<String> pagina = new ArrayList<String>(); 
private ArrayList<String> categoria = new ArrayList<String>(); 
public void setNombre(String nombre){ 
    this.nombre.add(nombre); 
} 
public ArrayList<String> getNombre(){ 
    return this.nombre; 
} 

public void setPagina(String pagina){ 
    this.pagina.add(pagina); 
} 
public ArrayList<String> getPagina(){ 
    return this.pagina; 
} 

public void setCategoria(String categoria){ 
    this.categoria.add(categoria); 
} 
public ArrayList<String> getCategoria(){ 
    return this.categoria; 
} 
} 


//LecturaXML.java 
package net.net46.sourcecode.android.lectorxml2; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
public class LecturaXML extends DefaultHandler{ 
public static Lista lista = null; 
private Boolean elementoActual; 
private String valorActual = null; 
@Override 
public void startElement(String uri, String nombreLocal, 
         String qNombre, Attributes atributos) 
throws SAXException{ 
    elementoActual = true; 
    if(nombreLocal.equals("tecnologias")){ 
     lista = new Lista(); 
    }else if(nombreLocal.equals("pagina")){ 
     String attr = atributos.getValue("categoria"); 
     lista.setCategoria(attr); 
    } 
} 
@Override 
public void endElement(String uri, String nombreLocal, String qNombre) 
throws SAXException{ 
    elementoActual = false; 
    if(nombreLocal.equalsIgnoreCase("nombre")){ 
     lista.setNombre(valorActual); 
    }else if(nombreLocal.equalsIgnoreCase("pagina")){ 
     lista.setPagina(valorActual); 
    } 
} 
@Override 
public void characters(char[]ch, int inicio, int longitud) 
throws SAXException{ 
    if(elementoActual){ 
     valorActual = new String(ch,inicio,longitud); 
     elementoActual = false; 
    } 
} 

public static Lista getLista(){ 
    return lista; 
} 
public static void setLista(Lista lista){ 
    LecturaXML.lista = lista; 
} 
} 



//LectorXML2Activity.java 
package net.net46.sourcecode.android.lectorxml2; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.parsers.SAXParser; 
import net.net46.sourcecode.android.lectorxml2.R; 
import org.xml.sax.XMLReader; 
import org.xml.sax.InputSource; 
import java.net.URL; 
public class LectorXML2Activity extends Activity{ 
Lista lista = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    LinearLayout vista = new LinearLayout(this); 
    vista.setOrientation(1); 
    TextView[] nombre; 
    TextView[] pagina; 
    TextView[] categoria; 
    try{ 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 
     URL url = new URL("http://sourcecode.net46.net/android/xml/tecnologies.xml"); 
     LecturaXML lectura = new LecturaXML(); 
     xr.setContentHandler(lectura); 
     xr.parse(new InputSource(url.openStream())); 
    }catch(Exception e){ 
     System.out.println("Error: " + e.getMessage()); 
    } 
    lista = LecturaXML.lista; 
    nombre = new TextView[lista.getNombre().size()]; 
    pagina = new TextView[lista.getNombre().size()]; 
    categoria = new TextView[lista.getNombre().size()]; 
    for(int i=0;i<lista.getNombre().size();i++){ 
     nombre[i] = new TextView(this); 
     nombre[i].setText("Nombre: "+lista.getNombre().get(i)); 
     pagina[i] = new TextView(this); 
     pagina[i].setText("Pagina: "+lista.getPagina().get(i)); 
     categoria[i] = new TextView(this); 
     categoria[i].setText("Categoría: "+lista.getCategoria().get(i)); 
     vista.addView(nombre[i]); 
     vista.addView(pagina[i]); 
     vista.addView(categoria[i]); 
    } 
    setContentView(vista); 
} 
} 

//AndroidManifest.xml 
<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="net.net46.sourcecode.android.lectorxml2" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="14" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".LectorXML2Activity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
</manifest> 

, 내가 제대로하는 방법?, 작동하도록 놓친 거지 무엇을 : LectorXML2Activity.java, Lista.java, LecturaXML.java, 여기에 코드입니다 그 NullPointerException 문제를 해결할 수 있습니까? 사전에 thnx ..

+0

Welcome to Stackoverflow! 답변이 도움이된다면 투표하십시오. 응답으로 질문에 성공적으로 답변 한 경우 옆에있는 녹색 확인 표시를 클릭하여 대답을 수락하십시오. 또한 좋은 질문을 쓰는 방법에 대한 조언은 http://stackoverflow.com/questions/how-to-ask에서 확인하십시오. –

답변

0

당신은이 중 하나를 초기화하지 않습니다

public static Lista lista = null; 
private String valorActual = null; 

그들은 널 유지하고 당신에게 null 포인터 예외를 발생한다. 사용하기 전에 초기화해야합니다. 예를 들면 다음과 같습니다 :

public static Lista lista = new Lista(); 
private String valorActual = ""; 
+0

Urbana, IL에 인사드립니다. 그래, NullPointer 문제가 해결되었지만 여전히 빈 화면이 표시됩니다. 결과 – gera

+0

중단 점을 사용하여 실제 진행 상황을 확인하십시오. 빈 데이터를 설명해야합니다. – Merlin

+0

@Merlin LectorXML2Activity.java 파일에서이 줄에 중단 점을 사용했습니다. nombre = new TextView [lista.getNombre(). size()]; 왜냐하면 NullPointerException이 던져지는 곳이 있다고 생각하기 때문입니다. public static Lista lista = null; 전용 문자열 valorActual = null; 커티스 (Kurtis)가 파싱 문제를 해결할 때 언급 한대로 빈 목록을 얻으려고합니다. – gera