Java异常没有被捕获

时间:2012-05-17 20:46:06

标签: java exception

这怎么可能?看起来像白天一样,来自第三方库的异常正在跳过我的catch块。不知道从哪里开始排除故障。这要么是我真的很愚蠢,要么我不理解关于异常和Java的微妙之处。

我的控制台:

Exception: org.apache.james.mime4j.io.MaxLineLimitException: Maximum line length limit exceeded; stack: org.apache.james.mime4j.stream.MimeEntity.readRawField(MimeEntity.java:242); org.apache.james.mime4j.stream.MimeEntity.nextField(MimeEntity.java:258); org.apache.james.mime4j.stream.MimeEntity.advance(MimeEntity.java:296); org.apache.james.mime4j.stream.MimeTokenStream.next(MimeTokenStream.java:360); me.unroll.scanner.Scanner.<init>(Scanner.java:206); me.unroll.scanner.ScannerThread.run(ScannerThread.java:205); java.lang.Thread.run(Thread.java:722)

问题是我的代码如下:

try {  
//...
 for(EntityState token = messageStream.getState();
    token != EntityState.T_END_OF_STREAM;
    token = messageStream.next()) {  //this is Scanner.java:206
//...
catch(ScanComplete exc) { }
catch(MaxLineLimitException exc) { //line 282, matches "try" above
    debug("Am I getting caught?"); //no, it's not

我更多

3 个答案:

答案 0 :(得分:5)

您正试图捕获错误的异常类型。

MimeTokenStream.next()的签名表示它可以抛出MimeException,但您没有抓住它。 (顺便说一句,如果你想知道为什么没有捕获异常,你可以尝试捕获Exception并记录异常类型以查看实际被抛出的内容。)

现在,如果您查看实际异常来源的源代码,MimeEntity.readRawField的第242行,您会看到:

241        } catch (MaxLineLimitException e) {
242            throw new MimeException(e);
243        }

因此,即使控制台消息显示 MaxLineLimitException,该方法抛出的实际异常也是MimeException。尝试在代码中使用MimeException代替MaxLineLimitException,但要注意MimeTokenStream.next()除了您遇到的原因之外,还可能因其他原因而抛出MimeException

答案 1 :(得分:1)

一种可能性是记录了异常,随后被捕获而不是重新抛出。您可以在异常本身上放置一个断点,然后从那里走出来,直到找到您的方法。

答案 2 :(得分:1)

'悲惨变量'可能是正确的。另一个选择是您导入了错误的MaxLineLimitException类。