Analyzer.analyze has the following code:
public Frame<V>[] analyze(...) ... merge(0, currentFrame, null); ... try { ... merge(targetInsnIndex, currentFrame, subroutine); ... } catch (AnalyzerException e) { throw new AnalyzerException( e.node, "Error at instruction " + insnIndex + ": " + e.getMessage(), e); } catch (RuntimeException e) { // DontCheck(IllegalCatch): can't be fixed, for backward compatibility. throw new AnalyzerException( insnNode, "Error at instruction " + insnIndex + ": " + e.getMessage(), e); } }
Here, merge(0, currentFrame, null) can throw AnalyzerException, but it is not enclosed in the try statement. As a result, its thrown exceptions are not handled like other merges like merge(targetInsnIndex, currentFrame, subroutine);