2011-04-16 4 views
0

J'ai une méthode void qui fait partie d'un flux exécuté par une tâche de planificateur à quartz.pourquoi ce code génère une exception?

Le contenu de cette méthode est le code:

try { 
     InputStream ris = this.getClass().getResourceAsStream("arialuni.ttf"); 
     byte[] ttfAfm = new byte[1]; 
     if (ris != null) { 
      System.out.println("toByteArray START"); 
      ttfAfm = IOUtils.toByteArray(ris); 
      System.out.println("toByteArray END"); 
     } else 
      System.out.println("input stream from arailuni.ttf is null!!!"); 
     ris.close(); 
     ris = null; 
     bfChinese = 
       BaseFont.createFont("arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, ttfAfm, null); 
     System.out.println("in myinit() try catch END"); 
    } catch (Exception e) { 
     System.out.println("exception encountered at myinit() " + e); 
    } 

Il est très étrange que cela fonctionne belles environ 30 fois (essentiellement, le planificateur scanne un répertoire, prendre une PCL trouvé et la convertit en PDF en utilisant cette police ARIALUNI.TTF) mais tout à coup, il donne l'exception follwing:

19:06:24,316 INFO [STDOUT] toByteArray START 
19:06:28,218 ERROR [ReportPollingJob] java.lang.reflect.InvocationTargetExceptio 
n 
//nothing else here (yes, the exception is only one line...) 

à IOUtils.toByteArray(ris)

Peut-il être à cause de la mémoire? Il est très étrange que cela ne va pas à mes prises, mais jette juste cette exception ...

Pouvez-vous donner un indice?

MISE À JOUR: Merci à MDMA: Je l'ai changé pour attraper (Throwable e) et maintenant je vois:

java.lang.OutOfMemory: JavaHeap Space 

qui ne sera pas facile à résoudre ...

+1

Plus d'infos sur l'exception, sur ce dont elle se plaint réellement? – BugFinder

+0

C'est fondamentalement le problème principal, que je n'ai aucune autre sortie après cette erreur courte .... –

+0

Normalement java est incroyablement vocal sur ses exceptions. Souvent au point que vous souhaitez, ce n'était pas le cas. – BugFinder

Répondre

2

Le InvocationTargetException est juste un wrapper pour l'exception réelle, donc vous devriez analyser cela (via getCause()). C'est probablement un OutOfMemoryError, qui ne sous-classe pas Exception. Pour intercepter toutes les conditions d'erreur, sélectionnez à la place Throwable.

1

Ceci est probablement pas pertinente à l'erreur que vous voyez, mais il est une erreur:

Si Ris null, vous obtiendrez un NullPointerException. Vous devez quitter la méthode après

System.out.println("input stream from arailuni.ttf is null!!!"); 

ou il wil suivant essayez d'exécuter

ris.close() 

entraînant une NullPointerException.

+1

+1. Merci pour le point. –

0
try { 
    InputStream ris = this.getClass().getResourceAsStream("arialuni.ttf"); 
    byte[] ttfAfm = new byte[1]; 
    if (ris != null) { 
     System.out.println("toByteArray START"); 
     ttfAfm = IOUtils.toByteArray(ris); 
     System.out.println("toByteArray END"); 
    } else 
     System.out.println("input stream from arailuni.ttf is null!!!"); 
    ris.close(); // it will through NullPointerException in ris is null 
    ris = null; 
    bfChinese = 
    BaseFont.createFont("arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, ttfAfm, null); 
    System.out.println("in myinit() try catch END"); 
} catch (Exception e) { 
    System.out.println("exception encountered at myinit() " + e); 
} 

Lorsque vous travaillez avec des ressources de la bonne pratique est comme ci-dessous

InputStream resource; 
try { 
    resource = createResource(); 
    //use resource object whatever way you want 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
finally { 
    if(resource != null) { 
     resource.close(); 
    } 
} 

procédure ci-dessus est vrai pour tout type de ressource.

Questions connexes