Variable ist gefüllt, kann aber nicht ausgegeben werden.

  • Antworten:5
  • OffenNicht stickyNicht beantwortet

Gelöschter Account

21.02.2011 18:31:41

Hallo zusammen,

ich bins wieder. Ich wusste nicht genau, wie ich den Titel passend schreiben sollte, daher Entschuldigung für den unklaren Titel.
Folgendes Problem. Baue einen RSS-Reader, der bestimmte Teile einer xml ausliest und ausgibt. Habe es am Anfang mit 2 Tags probiert undzwar mit "title" und "link", dass funktioniert auch wunderbar.
Dann wollte ich den tag "pubDate", um das Datum zu bekommen, hinzufügen, doch hier scheiterts. Habe die Codezeilen für "pubDate" genauso angepasst, wie die von title und link aber er gibt mir folgenden Fehler aus:

102-21 13:27:33.343: ERROR/AndroidRuntime(307): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidpeople.xml.parsing/com.androidpeople.xml.parsing.XMLParsingExample}: java.lang.IndexOutOfBoundsException: Invalid index 20, size is 20

Habe mir daraufhin alle einzelnen Schritte, die ich damit mache, im LogCat angeschaut, ob die Variable auch gefüllt ist. Die Variable ist überall gefüllt, habe aber das gefühl, dass sie beim Ausgeben einen Fehler verursacht, als ob sie wieder leer wäre.

#################################################################
#################################################################
package com.androidpeople.xml.parsing;

import java.net.URL;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import android.util.Log;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class XMLParsingExample extends Activity {

/** Create Object For SiteList Class */
SitesList sitesList;
WebView mWebView;


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

/** 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 datum[];


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.malte-heyenga.de/test.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 lenght by arraylist size */
name = new TextView[sitesList.getName().size()];
website = new TextView[sitesList.getWebsite().size()];
datum = new TextView[sitesList.getDate().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("Titel = "+sitesList.getDate().get(i));

#################################################################
#################################################################

Das ist der erste Codeblock. bei /** Assign textview array lenght by arraylist size */ habe ich mir das "datum" auch im LogCat angeschaut, wo genau das drin stand, was dort drin stehen soll.

#################################################################
#################################################################
datum[i] = new TextView(this);
datum[i].setText("Titel = "+sitesList.getDate().get(i));



Log.d("whatever"," myObject isNull:"+datum[i]);
website[i] = new TextView(this);
website[i].setText("Website = "+sitesList.getWebsite().get(i));
final String test = sitesList.getWebsite().get(i);
website[i].setOnClickListener(new OnClickListener(){
public void onClick(View v) {
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(test);
}
});

layout.addView(name[i]);
layout.addView(datum[i]);
layout.addView(website[i]);
}
/** Set the layout view to display */
setContentView(layout);
}
}
#################################################################
#################################################################

Hier möchte ich dies nun ausgeben um das Datum anzeigen zu lassen (die ersten beiden Zeilen meine ich), doch ab hier geht es net weiter. Wenn ich diese 2 Zeilen lösche, dann gibt es keinen force close und das Programm startet.
Am Anfang bestand der "pubDate" Tag aus Buchstaben und Zahlen. Da dachte ich, dass es vill. daran liegt, da ich ja einen String einlese. Habe dann alle "pubDate" einfach in "Sonntag" umbenannt aber das hat leider auch nichts gebracht.

Ich weiß nicht wo der Fehler ist und habe schon sau viel probiert und sehen warscheinlich den Wald vor lauter Bäumen nicht. Die App besteht aus 3 Dateien, die ich euch noch anhänge, da der Beitrag sonst endlos lang wird und unübersichtlich ist, wenn man soviel scrollen muss.Falls ich was vergessen habe, was ihr braucht, schreibt es bitte. Hier hänge ich noch den ganzen Log an:

102-21 13:27:33.343: ERROR/AndroidRuntime(307): FATAL EXCEPTION: main
202-21 13:27:33.343: ERROR/AndroidRuntime(307): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidpeople.xml.parsing/com.androidpeople.xml.parsing.XMLParsingExample}: java.lang.IndexOutOfBoundsException: Invalid index 20, size is 20
302-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
402-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
502-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
602-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
702-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.os.Handler.dispatchMessage(Handler.java:99)
802-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.os.Looper.loop(Looper.java:123)
902-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread.main(ActivityThread.java:4627)
1002-21 13:27:33.343: ERROR/AndroidRuntime(307): at java.lang.reflect.Method.invokeNative(Native Method)
1102-21 13:27:33.343: ERROR/AndroidRuntime(307): at java.lang.reflect.Method.invoke(Method.java:521)
1202-21 13:27:33.343: ERROR/AndroidRuntime(307): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
1302-21 13:27:33.343: ERROR/AndroidRuntime(307): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
1402-21 13:27:33.343: ERROR/AndroidRuntime(307): at dalvik.system.NativeStart.main(Native Method)
1502-21 13:27:33.343: ERROR/AndroidRuntime(307): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 20, size is 20
1602-21 13:27:33.343: ERROR/AndroidRuntime(307): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
1702-21 13:27:33.343: ERROR/AndroidRuntime(307): at java.util.ArrayList.get(ArrayList.java:311)
1802-21 13:27:33.343: ERROR/AndroidRuntime(307): at com.androidpeople.xml.parsing.XMLParsingExample.onCreate(XMLParsingExample.java:72)
1902-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
2002-21 13:27:33.343: ERROR/AndroidRuntime(307): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

Und hier die 3 Dateien:
MyXMLHandler.java
SitesList.java
XMLParsingExample.java

Liebe Grüße,
Malte

P.s. Irgentwie funktioniert der Code Tag bei mir net richtig, deswegen stellenweise die Raute.

21.02.2011 21:46:43

Ich denke das Problem wird darin liegen, dass du 3 Listen aus 3 separaten Quellen aufbaust und deine For-Schleife die Größe EINER dieser Liste für ihren Iterator-Index benutzt.
Wenn die Listen nicht die gleiche Größe haben und eine der Listen nun kleiner ist, kommt genau dieser Fehler bei raus.

Gelöschter Account

21.02.2011 22:53:32

Tausend Dank Rafael, dass war die Antwort die ich brauchte, konnte den Fehler beheben :) Ich weiß net, ob des die schönste Lösung ist (bestimmt nicht) aber jetzt mache ich es so:

1for (int i = 0; i < sitesList.getName().size() && i < sitesList.getDate().size() && i < sitesList.getWebsite().size(); i++)

Nochmals vielen Dank!

Grüße,
Malte

21.02.2011 23:15:35

Schöner wäre es du machst dir eine eigene Klasse mit den 3 Attributen.
Jeweils getter und setter dafür und speicherst die Werte für eine Zeile in einem Objekt.
Dann brauchst Du nur eine(!) Liste aus diesen Objekten.

Schließlich gehören die ja auch logisch zusammen, sollten also auch lokal zusammenstehen.

22.02.2011 10:17:03

Ich weiß net, ob des die schönste Lösung

Schön ist sie zumindest insofern als das sie dir gezeigt hat, das deine Implementierung fehlerhaft ist ;)

Schau mal:
wenn die Listen unterschiedlich viele Elemente enthalten, dann bedeutet das, daß deine .xml nicht für jedes item alle Daten enthält;
wenn du nun für vorhandene Daten jeweils ein .add() auf deine drei Listen machst, dann passiert es zwangsläufig, das du am Ende Daten anzeigst, die gar nicht zusammengehörig sind;
einfaches Beispiel: gleich das erste item aus dem .xml kommt ohne website, aber mit namen; das zweite item kommt mit beidem, jetzt steht in namen[0] der Name des ersten items und in websites[0] der URL des zweiten items.