Generell: Frage zu IO-Exception

andy72

Erfahrenes Mitglied
Hi @all,

habe mal wieder angefangen mit Java zu programmieren und komme nicht weiter:
Versucht meine App auf das Internet zuzugreifen ohne daß eine Verbindung besteht, kommt eine IO-Exception mit "Unknown Host" - soweit ja klar und auch Verständlich, und ich hab das ganze auch mit try/catch/finally abgearbeitet.

Leider beendet sich meine App unter Android somit - was meine Frage aufwirft:
Kann man Exceptions auch abhandeln ohne daß eine App dabei beendet wird ?
Wie prüft man am besten ab, ob eine Verbindung besteht ?

Bei mir läuft das ganze in einem TimerTask ab, der alle 30 Minuten versucht eine Verbindung aufzubauen.

Danke & LG
Andy
 
Howdie.

Da ich noch nie für Android programmiert habe, erstmal eine Frage:
Läuft das unter J2ME oder der normalen J2SE?

Der Sinn von Exception-Handling ist ja eigentlich der, dass man auf Fehler reagieren kann und nicht gleich die Applikation abschmiert... Daher finde ich es seltsam, was da bei dir passiert. Wird vielleicht ein Error geworfen statt einer Exception? Und was machst du in den catch/finally-Blöcken? Vielleicht wird hier nochmals ein Fehler ausgelöst durch ein close() oder ähnliches.

Wenn ich mit Kommunikations-Protokollen arbeite (egal ob zu Hardware oder ins Netzwerk), prüfe ich die Verdindung manchmal ebenfalls durch zyklisches Polling, so wie du. Hierbei ist allerdings problematisch, dass die Verbindung nicht garantiert noch vorhanden ist, wenn du dann eine Abfrage o.Ä. darüber senden willst.
Daher habe ich für solche Projekte inzwischen meistens eine State-Machine am Laufen. Finde ich persönlich einfacher, Dinge wie Synchronisation zwischen TimerTask, Threads oder sowas fallen weg.

Gruß
miffi
 
Hossa,

erstmal Danke für Deine schnelle Antwort.

Ich rufe am Anfang der Funktion eigentlich nur eine Url auf:
Code:
try {
  URL u = new URL("http://irgendwas.de");
  HttpURLConnection conn = (HttpURLConnection)u.openConnection();
.......
  // irgendwann wenn alles verarbeitet ist:
  conn.close();
}
catch(MalformedURLException mue) {
  mue.printStackTrace();
}
catch(IOException ioe) {
 ioe.printStackTrace();
}
finally {
  // verarbeite daten der URL
}

Die App kommt so bis zur IOException und wird danach beendet: "Unknown Host".
Ob das unter Android normal weiß ich leider nicht, auch nicht ob da mit J2SE oder J2ME gearbeitet wird: sieht man das irgendwie/irgendwo ?

PS:
Viellt. kann es ja sein, dass die App wegen dem "conn.close()" abschmiert, weil ja gar keine Verbindung offen ist ?

LG & Danke
 
Zuletzt bearbeitet:
Moin,

Ich rufe am Anfang der Funktion eigentlich nur eine Url auf:
Code:
try {
  URL u = new URL("http://irgendwas.de");
  HttpURLConnection conn = (HttpURLConnection)u.openConnection();
.......
  // irgendwann wenn alles verarbeitet ist:
  conn.close();
}
catch(MalformedURLException mue) {
  mue.printStackTrace();
}
catch(IOException ioe) {
 ioe.printStackTrace();
}

Das hängt davon ab, wo genau die Exception auftritt ..... :rolleyes:

Ist eine der beiden Zeilen
Java:
URL u = new URL("http://irgendwas.de");
HttpURLConnection conn = (HttpURLConnection)u.openConnection();
dann ist möglicherweise die Adresse falsch !

Ich validiere sie immer mit folgendem Code:
Java:
boolean validateUrl( URL url ) 
{
    boolean bLoadOK = true;
    HttpURLConnection httpcon = null;
    int responsecode = -1;
    if ( (bLoadOK) && (url != null)) {
      try {
        String strTheHostIP = InetAddress.getByName(url.getHost()).getHostAddress() ;
        String strTheHostname = InetAddress.getByName(url.getHost()).getHostName();
        int thePort = url.getPort();
        String thePath = url.getPath();
        URL theURL = null;
        if (thePort == -1){
          theURL = new URL("http://" + strTheHostIP + thePath);
        } else {
          theURL = new URL("http://" + strTheHostIP + ":" + thePort + thePath);
        }
        httpcon = (HttpURLConnection) theURL.openConnection();
        httpcon.setRequestProperty( "Host", strTheHostname);
        responsecode = httpcon.getResponseCode();
      }
      catch (IOException ex1) {
        bLoadOK = false;
      }
    }
    if (responsecode != java.net.HttpURLConnection.HTTP_OK) // 200 -> HTTP_OK
    {
      bLoadOK = false;
    }
    else
    {
      bLoadOK = true;
    }
    return bLoadOK;
}

Andernfalls tritt der Fehler in
Java:
..........
auf :D

Dann solltest Du da mal schrittweise mit dem Debugger durchgehen, um die genaue Zeile zu ermitteln !

Gruß
Klaus
 
Howdie.

Klaus hat eigentlich alles bereits ausreichend erläutert.
Das einzige, was ich dir noch empfehlen möchte, ist eine Erweiterung des try-catch-Blocks: Bei so kritischen und vielfältigen Operation, wie es hier der Fall ist, können einige Fehler auftreten. Ich würde immer ans Ende der spezifischen Exception-Catcher einen allgemeinen catch(Exception e)-Block setzen. Dann ist garantiert, dass auch bei nicht geplanten Fehlern nicht gleich die Applikation hängt. Außerdem bringt der Strack-Trace vielleicht auch ein wenig Licht in die Sache.

Die Methode conn.close() schließt eigentlich nur den Stream der Verbindung... Weiß jetzt grad nicht, ob dadurch eine Exception ausgelöst wird, nur ein boolean zurückgegeben wird oder gar nichts passiert.

Gruß
miffi
 
Zuletzt bearbeitet:
Danke Ihr 2 beiden,

hat sich erledigt: Ich hab das URL-Object versehentlich außerhalb eines anderen try/catch (für XML/SAX) instanziert - war nicht ganz so clever von mir :D Habe die try/catch Blöcke nun zusammengeführt und nun steigt meine App auch nicht mehr aus bei einem Fehler :)

LG & Danke nochmal
 
Zurück