Java异常没有被捕获

dje*_*lin 5 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
Run Code Online (Sandbox Code Playgroud)

我更

mat*_*tts 5

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

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

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

241        } catch (MaxLineLimitException e) {
242            throw new MimeException(e);
243        }
Run Code Online (Sandbox Code Playgroud)

因此,即使控制台消息 MaxLineLimitException,该方法抛出的实际异常是MimeException.尝试捕捉MimeException你的代码而不是MaxLineLimitException,但要注意除了你遇到的那个之外,MimeTokenStream.next()它可能会抛出MimeException其他原因.