为什么这段代码抛出异常?

时间:2011-04-16 16:09:36

标签: java

我有一个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

这不容易解决......

3 个答案:

答案 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();
    }
}

以上程序适用于任何类型的资源。