2011-11-17 83 views
0

我試圖分析此:xml's url
通過下面這個教程Android XML Parsing Tutorial - Using SAXParser,我試圖修改源代碼,但我得到了一個錯誤:的Android,解析問題,以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。從原來的嘖嘖三個修改後的源代碼類現在:LectorXML2Activity.java,Lista.java,LecturaXML.java,下面的代碼:

//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> 

所以,我缺少什麼,使其正常?,如何工作我是否解決了NullPointerException問題?日Thnx提前..

+0

歡迎來到Stackoverflow!如果您發現回覆有幫助,請投票。如果回覆成功回答您的問題,請點擊旁邊的綠色複選標記以接受答案。也請看看http://stackoverflow.com/questions/how-to-ask關於如何寫一個好問題的建議 –

回答

0

你不初始化任一:

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

他們留下空,並造成你一個空指針異常。在使用它們之前,你需要初始化它們。以下可能會工作,例如:

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

對伊利諾斯州Urbana的問候..是的,這解決了NullPointer問題,仍然是一個空白的屏幕,沒有結果 – gera

+0

使用斷點逐步查看代碼,以查看實際發生的情況。它應該解釋你的空數據。 – Merlin

+0

@Merlin我在LectorXML2Activity.java文件的這一行使用了一個斷點: nombre = new TextView [lista.getNombre()。size()];因爲我認爲有引發NullPointerException但替換這些行的地方:public static Lista lista = null; private String valorActual = null;因爲庫爾蒂斯提到不會解決解析問題,因爲我會得到一個空列表 – gera