Wie ein Java ungeprüft / Runtime-Ausnahme (speziell Security) fangen
Frage
Ich habe Java Klasse mit einer Methode, die ein Bild von einer Website bekommt:
private Image image;
private int height;
private int width;
private String imageUri;
public Image getImage() {
if (image == null) {
log.info("Fetching image: " + imageUri);
try {
URL iURL = new URL(imageUri);
ImageIcon ii = new ImageIcon(iURL);
image = ii.getImage();
height = image.getHeight(null);
width = image.getWidth(null);
} catch (SecurityException e) {
log.error("Unable to fetch image: " + imageUri,e);
} catch (MalformedURLException e) {
log.error("Unable to fetch image: " + imageUri,e);
}
}
return image;
}
Das Problem ist, dass manchmal die imageUri ich versuche, wird umgeleitet zu holen, den ImageIcon Konstruktor verursachte einen java.lang.SecurityException zu werfen -., Die nicht von der catch-Klausel aufgefangen wird, so dass mein Programm beenden
Kann jemand empfehlen, wie ich könnte diese Ausnahme fangen?
Danke
Lösung 4
Durch ImageIcon extrem alte Schule zu sein und einen neuen Thread Laichen (was ich will nicht), meine Lösung ist wie folgt:
public Image getImage() {
if (image == null) {
log.info("Fetching image: " + imageUri);
try {
URL iURL = new URL(imageUri);
InputStream is = new BufferedInputStream(iURL.openStream());
image = ImageIO.read(is);
height = image.getHeight();
width = image.getWidth();
} catch (MalformedURLException e) {
log.error("Unable to fetch image: " + imageUri, e);
} catch (IOException e) {
log.error("Unable to fetch image: " + imageUri, e);
}
}
return image;
}
Alle Probleme mit Umleitungen, toten Links etc jetzt ordnungsgemäß behandelt werden.
Andere Tipps
Die Ausnahme vom Konstruktor geworfen wird, die nicht im try-Block gewickelt wird.
new ImageIcon(new URL(imageUri))
ImageIcon Mit einem Bild zu laden ist sooooo 1998. Sie wollen ImageIO.read () .
Wenn die Ausnahme in der Tat von getImage geworfen (), Code sollte es fangen. Security ist Ausnahme. Du hast es falsch irgendwo bekam. Zum Beispiel Ort ImageIcon Konstruktor unter Versuch. Wenn dies nicht hilft, versuchen Sie
catch( Throwable th )
Es ist eine schlechte Angewohnheit, though. Versuchen Sie, mindestens bis zur Wieder werfen sie (oder eine Wrapper-Ausnahme), nachdem er die Anmeldung.
Dies ist ein alter Thread -. Aber ich dachte, die Zugabe eine alternative Antwort, da ich es bekam nach dem gleichen Problem zu erreichen und diesen Beitrag schlagen
Da will ich nicht mehr Abhängigkeiten meiner app (= javax) hinzufügen Früher habe ich die Lösung hier vorgeschlagen, um die Bitmap zu bekommen und dann habe ich setImageBitmap in diesem Fall die Security ist gefangen