diff --git a/jadx-core/src/main/java/jadx/core/dex/trycatch/CatchAttr.java b/jadx-core/src/main/java/jadx/core/dex/trycatch/CatchAttr.java index 6dfc1b4c8640cf65f7999c766ba71fb526775c26..0a85670e181a85c7b59f50a87ae718573d3ac126 100644 --- a/jadx-core/src/main/java/jadx/core/dex/trycatch/CatchAttr.java +++ b/jadx-core/src/main/java/jadx/core/dex/trycatch/CatchAttr.java @@ -1,5 +1,6 @@ package jadx.core.dex.trycatch; +import java.util.Comparator; import java.util.List; import jadx.api.plugins.input.data.attributes.IJadxAttribute; @@ -8,9 +9,14 @@ import jadx.core.utils.Utils; public class CatchAttr implements IJadxAttribute { + public static CatchAttr build(List handlers) { + handlers.sort(Comparator.comparingInt(ExceptionHandler::getHandlerOffset)); + return new CatchAttr(handlers); + } + private final List handlers; - public CatchAttr(List handlers) { + private CatchAttr(List handlers) { this.handlers = handlers; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/AttachTryCatchVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/AttachTryCatchVisitor.java index d3060b5db5c8449392ad4971e81375fe8d4f55c5..016dca680046792eba857be0517d83e91d55047a 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/AttachTryCatchVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/AttachTryCatchVisitor.java @@ -55,7 +55,7 @@ public class AttachTryCatchVisitor extends AbstractVisitor { if (handlers.isEmpty()) { continue; } - markTryBounds(insnByOffset, tryData, new CatchAttr(handlers)); + markTryBounds(insnByOffset, tryData, CatchAttr.build(handlers)); } } @@ -96,7 +96,7 @@ public class AttachTryCatchVisitor extends AbstractVisitor { if (existAttr != null) { // merge handlers List handlers = Utils.concat(existAttr.getHandlers(), catchAttr.getHandlers()); - insn.addAttr(new CatchAttr(handlers)); + insn.addAttr(CatchAttr.build(handlers)); } else { insn.addAttr(catchAttr); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java index 9f8c3961ce3a76aea43eeffc77973f1dc8287537..8e7b5fbca8e07d98bbdb92a1e8bcfacebe155b86 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java @@ -126,7 +126,7 @@ public class BlockExceptionHandler { commonCatchAttr = catchAttr; continue; } - if (commonCatchAttr != catchAttr) { + if (!commonCatchAttr.equals(catchAttr)) { return null; } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch2.java b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch2.java new file mode 100644 index 0000000000000000000000000000000000000000..a80e32419480ce94251cd81a812d36c9424919ea --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch2.java @@ -0,0 +1,38 @@ +package jadx.tests.integration.trycatch; + +import jadx.tests.api.IntegrationTest; +import jadx.tests.api.extensions.profiles.TestProfile; +import jadx.tests.api.extensions.profiles.TestWithProfiles; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestNestedTryCatch2 extends IntegrationTest { + + public static class TestCls { + public void test() { + try { + try { + call(); + call(); + } catch (Exception e) { + exc(e); + } + } catch (Exception e) { + exc(e); + } + } + + private void call() { + } + + private void exc(Exception e) { + } + } + + @TestWithProfiles({ TestProfile.JAVA8, TestProfile.DX_J8 }) + public void test() { + assertThat(getClassNode(TestCls.class)) + .code() + .countString(2, "} catch (Exception "); + } +}