Hi,
ich sitze gerade an einem Projekt für die Schule. Es geht dabei darum, Inhalte einer HTML-Seite auszulesen und diese in einer Datenbank zu speichern. Das ganze soll auf einem Android-Betriebssytem laufen. Ich nutzte Eclispe als Entwicklungsumgebung mit Adroid SDK und eigentlich funktioniert auch alles gut. Heute ist folgender Fehler aufgtreten:
Dieser Code führt zu einer NullPointerException.
wenn ich das ganze so schreibe, tritt der Fehler nicht auf:
Der Fehler tritt im ersten Fall in der aufgerufenen Methode "readHTML" auf. Der InputStreamReader ist einfach leer. Obwohl mir im Debug-Modus beide Male die gleichen Werte von der Übergabe angezeigt werde, die übergeben werden.
Woran kann das liegen?
Hier noch mal die Klasse mit der Methode, in der der Fehler auftritt:
Schon mal im Voraus vielen Dank
ich sitze gerade an einem Projekt für die Schule. Es geht dabei darum, Inhalte einer HTML-Seite auszulesen und diese in einer Datenbank zu speichern. Das ganze soll auf einem Android-Betriebssytem laufen. Ich nutzte Eclispe als Entwicklungsumgebung mit Adroid SDK und eigentlich funktioniert auch alles gut. Heute ist folgender Fehler aufgtreten:
Dieser Code führt zu einer NullPointerException.
Java:
for(int i=0; i<2; i++) {
try {
Vertretungsplan = HTML_Schnittstelle.getVertretungsplan(datum[i]);
for(int j=0; j<Vertretungsplan.length; j++){
SQL_Helper.setVertretungsplan(Vertretungsplan[j][0], Integer.parseInt(Vertretungsplan[j][1]), Vertretungsplan[j][2], Vertretungsplan[j][3], Vertretungsplan[j][4], Vertretungsplan[j][5], datum[i]);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
wenn ich das ganze so schreibe, tritt der Fehler nicht auf:
Java:
try {
Vertretungsplan = HTML_Schnittstelle.getVertretungsplan(datum[0]);
for(int j=0; j<Vertretungsplan.length; j++){
SQL_Helper.setVertretungsplan(Vertretungsplan[j][0], Integer.parseInt(Vertretungsplan[j][1]), Vertretungsplan[j][2], Vertretungsplan[j][3], Vertretungsplan[j][4], Vertretungsplan[j][5], datum[0]);
}
} catch (IOException e1) {
e1.printStackTrace();
}
try {
Vertretungsplan = HTML_Schnittstelle.getVertretungsplan(datum[1]);
for(int j=0; j<Vertretungsplan.length; j++){
SQL_Helper.setVertretungsplan(Vertretungsplan[j][0], Integer.parseInt(Vertretungsplan[j][1]), Vertretungsplan[j][2], Vertretungsplan[j][3], Vertretungsplan[j][4], Vertretungsplan[j][5], datum[1]);
}
} catch (IOException e1) {
e1.printStackTrace();
}
Der Fehler tritt im ersten Fall in der aufgerufenen Methode "readHTML" auf. Der InputStreamReader ist einfach leer. Obwohl mir im Debug-Modus beide Male die gleichen Werte von der Übergabe angezeigt werde, die übergeben werden.
Woran kann das liegen?
Hier noch mal die Klasse mit der Methode, in der der Fehler auftritt:
Java:
package com.vertretungsplan_wge_app;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
public class HTML_Schnittstelle {
private static URL Vertretungsurl;
/**
* Gibt den Vertretungsplan, der zu einem bestimmten Datum gehört.
* @param Datum dd.mm.yyyy
* @throws IOException
*/
public static String[][] getVertretungsplan(String Datum) throws IOException {
String SourceCode = "";
Vertretungsurl = new URL("https://ssl.kundenserver.de/verwaltung.widukindgymnasium.de/vertretung_schueler.php");
SourceCode = readHTMLPage(Datum);
if(SourceCode.length()>0){
return interpretHTML(SourceCode);
}
return null;
}
/**
*
* Liest aus dem Quellcode die wichtigen Informationen aus.
* @param Quellcode Der zu zerlegende Quellcode wird übergeben.
* @return Gibt einen zweidimensionelen Array mit den Werten des Vertretungsplans zurück.
*
**/
public static String[][] interpretHTML(String Quellcode){
String[] Tabellen;
String InformationTabelle;
String[] Zeilen;
String Zeile;
List ZellenListe = new ArrayList<String[]>();
String[][] Zellen;
String[] Zelle;
String[] Helfer1;
String[] Helfer2=null;
boolean Doppelstunde=false;
Tabellen = Quellcode.split("<table id=\"table_outline\" style=\"table-layout:fixed\" border=0 cellpadding=2 cellspacing=0>");
InformationTabelle=Tabellen[1];
Zeilen = InformationTabelle.split("<tr>");
for(int i=0; i<Zeilen.length-4; i++){ //Zeilen.length-4 --> die unwichtigen Teile (2 am Anfang und 2 am Ende) werden ignoriert
Zeile = Zeilen[i+2];
Zelle = Zeile.split("<td");
Helfer2 = new String[6];
for(int j=0; j<Zelle.length-1; j++) {
Helfer1 = Zelle[j+1].split(">", 2);
Helfer1 = Helfer1[1].split("</td>");
if(j==5||j==4){
Helfer1[0] = Helfer1[0].replace("<b>","");
Helfer1[0] = Helfer1[0].replace("</b>","");
}
switch(j){
case 0: //Klasse
Helfer2[0] = Helfer1[0];
break;
case 1: //Stunde
if(Helfer1[0].contains(".-")){
Doppelstunde = true;
Helfer1 = Helfer1[0].split(".-",2);
}else{
Doppelstunde = false;
}
Helfer2[1] = Helfer1[0];
break;
case 3: //Fach
case 4: //Vert_Fach
Helfer2[j-1] = Helfer1[0];
break;
case 6: //Raum
Helfer2[j-2] = Helfer1[0];
break;
case 7: //Text
if(Helfer1[0].equals(" ")) {
Helfer2[j-2] = null;
}else {
Helfer2[j-2] = Helfer1[0];
}
break;
}
}
ZellenListe.add(Helfer2);
if(Doppelstunde)
{
Helfer2[1]=(new Integer(Integer.parseInt(Helfer2[1])+1)).toString();
ZellenListe.add(Helfer2);
}
}
Zellen = new String[ZellenListe.size()][6];
for(int i=0; i<ZellenListe.size(); i++){
Zellen [i] = (String[]) ZellenListe.get(i);
}
return Zellen;
}
/**
*
* Liest den Vertretungsplan für einen bestimmten Tag aus.
* @param Datum dd.mm.yyyy
* @return Gibt den dazugehörigen Quellcode zurück.
*
**/
public static String readHTMLPage(String Datum) throws IOException{
// Abrufen der HTML-Seite mit Übergabe des Datums via POST_METHODE
//Datum = Datum.split("-")[2]+"." + Datum.split("-")[1] + "." + Datum.split("-")[0];
String Übergabewert = "datum_button=" + URLEncoder.encode( Datum , "UTF-8" );
HttpURLConnection Verbindung = (HttpURLConnection) Vertretungsurl.openConnection();
Verbindung.setRequestMethod( "POST" );
Verbindung.setDoInput( true );
Verbindung.setDoOutput( true );
Verbindung.setUseCaches( false );
Verbindung.setRequestProperty( "Content-Length", String.valueOf(Übergabewert.length()) );
OutputStreamWriter Übergabe = new OutputStreamWriter( Verbindung.getOutputStream() );
Übergabe.write( Übergabewert );
Übergabe.close();
BufferedReader Leser = new BufferedReader(new InputStreamReader(Verbindung.getInputStream()));
StringBuilder Quellcode = new StringBuilder(128000);
int count;
char[] data = new char[5000];
while((count = Leser.read(data)) != -1) {
Quellcode.append(data, 0, count);
}
Leser.close();
return Quellcode.toString();
}
}
Schon mal im Voraus vielen Dank