# Bild URL über ImageIO.read



## Guest (8. Feb 2009)

Hallo,

ein Bild welches unter einer bestimmten URL erreichbar ist, kann ich ja über die Klasse ImageIO.read(url) als stream einlesen. Problematisch wird es nur, wenn die URL zwar "wohlgeformt", d.h. syntaktisch korrekt ist der Inhalt jedoch nicht ermittelt werden kann, z.B. weil dort gar kein Bild liegt. In diesem Falle würde ich ja eine Exception bekommen.

Wie kann ich prüfen, ob ein bestimmter Inhalt unter der URL verfügbar ist? Ich will eine Methode saveImage(Menge von URLs)
implementieren, welche eine Menge von URLs als Parameter bekommt. Falls ein Bild unter einer bestimmten URL nicht verfügbar ist, bekomme ich eine Exception und kann folglich nicht die anderen Bilder laden. Falls ich z.B. drei URLs habe. Die erste geht nicht, d.h. liefert keinen Inhalt, die anderen beiden funktionieren jedoch schon. Im Falle der Exception würde ich schon bei URL "rausfliegen", ohne Chance die anderen URLs zur prüfen bzw. die Bilder von da zu laden.

Ich hoffe ich konnte mich halbwegs klar ausdrücken  Ich will also, falls eine URL nicht geht trotzdem im Programm mit meiner Bildspeicherung fortfahren


----------



## SlaterB (8. Feb 2009)

so eine Exception ist doch kein endgültiges KO,
baue das try/ catch so, dass die Exception pro Bild einzeln abgefangen wird,

wenn eine Exception auftritt, dann ist meinetwegen das erste Bild null,
aber danach kann doch für Bild 2 und 3 normal weitergearbeitet werden

-----

bei einer derart aufwendigen Operation wie dem Laden eines Bildes aus dem Internet ist der Overhead einer Exception vernachlässigbar gering,
insofern macht es keinen Sinn, die Exception zu umgehen, indem vorher die Internetdatei manuell geladen und geprüft wird, das wäre doppelte Arbeit

im Gegensatz dazu wäre eine Java-Codezeile if (x != null) durchaus angebracht, 
falls damit eine NullPointerException vermieden werden kann,

aber beim Bild-laden ruhig in die Exception laufen,
try/ catch darf mal arbeiten


----------



## Gast (11. Feb 2009)

>wenn eine Exception auftritt, dann ist meinetwegen das erste Bild >null,
>aber danach kann doch für Bild 2 und 3 normal weitergearbeitet >werden 

Danke für deine Antwort. Aber dazu müsste der ExceptionBlock ja Zugriff auf die Image Variable haben

Bsp.


readImage {

      try {
           Image img = ImageIO.read(url);
           } 
           catch
                 {
                  img = null
                  }

         if(img==null) readNextImage
}   

Wie würdest du das lösen?


----------



## HoaX (11. Feb 2009)

Image img außerhalb deklarieren!?


----------



## Gast (11. Feb 2009)

Hmm,

Macht das einbringen von einer try/catch Klausel innerhalb des Codes den Quelltext nicht unübersichtlich? Normalerweise soll try/catch den Code doch übersichtlicher machen

folgendes geht also nicht

try 
  {
  irgendwelcher Code vorher
  Image img = ImageIO.read(url)
  irgendwelcher Code nachher 
  List l = ...
  l.add(img);
  }
  catch(Exception e)
  {
  // wenn image nicht gelesen werden konnte
  img = null
  }


----------



## SlaterB (11. Feb 2009)

Image img musst du immer noch außerhalb deklarieren

und richtig, mit try/ catch hast du immer gewisse Schwierigkeiten,
die kann man nicht wegdiskutieren,

-----

ich empfehle strengstens eine separate Methode

public static Image loadImage(..) {
try {
 return  ImageIO.read(url) 
catch (..) {
return null;
}
}


dann hast du durch Trennung schon wieder sauberen Code da überhaupt kein try/catch im wichtigen Code, 
und in der Hilfsmethode kein Problem mit Image außerhalb von try/catch zu definieren


----------



## Gast (12. Feb 2009)

hmm, ok. oder ich lasse die methode eine exception werfen, dann kann ich die immernoch im aufrufenden block zentral "fangen"


----------



## SlaterB (12. Feb 2009)

?? 
wenn du die Exception wirfst, wo ist dann der Unterschied zu direkt ImageIO.read(url)?

ohne Exception wäre der Unterschied, dass entweder das Bild geladen wird oder null zurückkommt


----------



## Gast (13. Feb 2009)

Richtig  Besten Dank!


----------

