2009-10-10 8 views
1

J'ai la classe java avec une méthode qui obtient une image à partir d'un site Web:Comment attraper un java sans contrôle/exception d'exécution (en particulier SecurityException)

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; 
} 

Le problème est que parfois le imageUri j'essaie de chercher obtient redirigé, provoquant le constructeur ImageIcon pour lancer une exception java.lang.SecurityException - qui n'est pas interceptée par la clause catch, provoquant l'arrêt de mon programme. Est-ce que quelqu'un peut suggérer comment je pourrais attraper cette exception?

Merci

+0

I voir aucun problème avec votre code édité. Essayez de déboguer à travers. – Kolibri

+0

Salut Kolibri - J'ai découvert le problème: l'exception est lancée par un thread séparé que le constructeur ImageIcon engendre - donc je ne peux pas l'attraper. –

+0

Hah, quelle erreur intéressante. Je n'aurais jamais deviné que le constructeur ImageIcon engendrerait un nouveau thread. Vous devrez créer Thread.UncaughtExceptionHandler pour gérer cette exception non contrôlée. – Kolibri

Répondre

0

En raison de ImageIcon étant très vieille école, et fraie un nouveau fil (que je ne veux pas), ma solution est la suivante:

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; 
} 

Tout problème avec les redirections, les liens morts, etc sont désormais prises en compte .

0

Si l'exception en effet jeté de getImage(), votre code doit l'attraper. SecurityException est une exception. Vous avez tort quelque part. Par exemple, placez le constructeur ImageIcon sous essai. Si cela n'aide pas, essayez

catch(Throwable th) 

C'est une mauvaise habitude. Essayez au moins de le relancer (ou une exception wrapper) après l'avoir enregistré.

+0

Salut - en fait c'est le constructeur ImageIcon qui lançait l'exception, j'ai mis à jour mon code pour l'inclure dans le catch. Cependant - il n'est toujours pas attrapé! Essayer votre suggestion. –

+0

Salut - J'ai essayé d'attraper le Throwable, mais en vain .... Je reçois toujours: 2009-10-10 15: 29: 02,301 [principal] INFO images.ImageData - Fetching image: http: //www.* ******. com/images/bg.jpg erreur Uncaught l'image enjoués: java.lang.SecurityException \t à java.lang.SecurityManager.checkPermission (SecurityManager.java:570) \t à java.lang. SecurityManager.checkConnect (SecurityManager.java:1086) \t at ..... –

1

L'exception est levée par le constructeur, qui n'est pas enveloppé dans le bloc try.

new ImageIcon(new URL(imageUri)) 
+0

Bonjour Jonathan, vous avez absolument raison - je l'ai juste couru dans le débogueur.Suis toujours avec le même problème cependant - l'exception n'est pas attrapée - modifie mon code pour refléter une nouvelle tentative de capture. –

1

En utilisant ImageIcon pour charger une image est sooooo 1998. Vous voulez ImageIO.read().

+0

Merci pour suggestion, en raison de ImageIcon engendrant un fil séparé que je fais maintenant exactement cela. –

0

Ceci est un ancien fil - mais j'ai pensé à ajouter une réponse alternative depuis que je l'ai eu après avoir atteint le même problème et en appuyant sur ce post.

Depuis que je ne veux pas ajouter d'autres dépendances à mon application (= javax) J'ai utilisé le solution suggested here pour obtenir le bitmap, puis j'ai utilisé setImageBitmap dans ce cas, le SecurityException est pris

Questions connexes