我有一个void方法,它是quartz scheduler task运行的流程的一部分。
此方法的内容是此代码:
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);
}
非常奇怪大约30次(基本上,调度程序扫描目录,找到任何找到的PCL并使用此arialuni.ttf字体将其转换为PDF)但突然间它给出了以下例外:
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)
可以因为记忆吗? 很奇怪,它不会出现在我的捕获中,但只是抛出了这个异常......
你能提一下吗?
更新:感谢mdma:我已经改为捕捉(Throwable e),现在我看到了:
java.lang.OutOfMemory: JavaHeap Space
这不容易解决......
答案 0 :(得分:2)
InvocationTargetException
只是真正异常的包装器,所以你应该分析它(通过getCause()
)。它可能是OutOfMemoryError
,它不是Exception
的子类。要捕获每个错误条件,请改为捕获Throwable
。
答案 1 :(得分:1)
这可能与您看到的错误无关,但这是一个错误:
如果ris为null,则会出现NullPointerException。您必须在
之后退出该方法System.out.println("input stream from arailuni.ttf is null!!!");
或者接下来会尝试执行
ris.close()
导致NullPointerException。
答案 2 :(得分: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);
}
使用资源时,良好的做法如下所示
InputStream resource;
try {
resource = createResource();
//use resource object whatever way you want
} catch (Exception e) {
e.printStackTrace();
}
finally {
if(resource != null) {
resource.close();
}
}
以上程序适用于任何类型的资源。