method A.():void { .src "tryCatch.java" .line 2 .prologue_end .line 2 0| move-object v0, v2 .local v0, "this", A 1| move-object v1, v0 2| invoke-direct {v1}, java.lang.Throwable.():void 5| return-void } method B.():void { .src "tryCatch.java" .line 6 .prologue_end .line 6 0| move-object v0, v2 .local v0, "this", B 1| move-object v1, v0 2| invoke-direct {v1}, java.lang.Throwable.():void 5| return-void } method TryCatch.():void { .src "tryCatch.java" .line 10 .prologue_end .line 10 0| move-object v0, v2 .local v0, "this", TryCatch 1| move-object v1, v0 2| invoke-direct {v1}, java.lang.Object.():void 5| return-void } method TryCatch.foo(int):int { .params "?" .src "tryCatch.java" .line 27 .prologue_end .line 27 0| move v0, v4 .local v0, "x", int 1| move v1, v0 2| if-lez v1, Label_4 .line 28 4| move v1, v0 5| packed-switch v1, Label_5 .line 31 8| const/4 v1, #+1 (0x00000001 | 1.40130e-45) 9| move v0, v1 Label_1: .line 34 .end_local v0 10| return v0 Label_2: .line 29 .restart_local v0 11| new-instance v1, A 13| move-object v3, v1 14| move-object v1, v3 15| move-object v2, v3 16| invoke-direct {v2}, A.():void 19| throw v1 Label_3: .line 30 20| new-instance v1, B 22| move-object v3, v1 23| move-object v1, v3 24| move-object v2, v3 25| invoke-direct {v2}, B.():void 28| throw v1 Label_4: .line 34 29| const/4 v1, #+0 (0x00000000 | 0.00000) 30| move v0, v1 31| goto/16 Label_1 33| nop Label_5: .line 28 34| packed-switch-payload 1: Label_2 2: Label_3 } method TryCatch.main(java.lang.String[]):void { .params "?" .src "tryCatch.java" .line 15 .prologue_end .line 15 0| move-object v0, v6 .local v0, "args", java.lang.String[] 1| const/4 v3, #+0 (0x00000000 | 0.00000) .try_begin_1 2| invoke-static {v3}, TryCatch.foo(int):int .try_end_1 catch(B) : Label_3 catch(A) : Label_4 catch(...) : Label_5 5| move-result v3 Label_1: .line 18 .line 22 6| sget-object v3, java.lang.System.out 8| const-string v4, "finally\n" 10| const/4 v5, #+0 (0x00000000 | 0.00000) 11| new-array v5, v5, java.lang.Object[] 13| invoke-virtual {v3,v4,v5}, java.io.PrintStream.printf(java.lang.String, java.lang.Object[]):java.io.PrintStream 16| move-result-object v3 Label_2: .line 23 .line 24 17| return-void Label_3: .line 16 18| move-exception v3 19| move-object v1, v3 .try_begin_2 .line 17 .local v1, "ex", B 20| sget-object v3, java.lang.System.out 22| const-string v4, "catch: B\n" 24| const/4 v5, #+0 (0x00000000 | 0.00000) 25| new-array v5, v5, java.lang.Object[] 27| invoke-virtual {v3,v4,v5}, java.io.PrintStream.printf(java.lang.String, java.lang.Object[]):java.io.PrintStream .try_end_2 catch(A) : Label_4 catch(...) : Label_5 30| move-result-object v3 31| goto/16 Label_1 Label_4: .line 19 .end_local v1 33| move-exception v3 34| move-object v1, v3 .try_begin_3 .line 20 .local v1, "ex", A 35| sget-object v3, java.lang.System.out 37| const-string v4, "catch: A\n" 39| const/4 v5, #+0 (0x00000000 | 0.00000) 40| new-array v5, v5, java.lang.Object[] 42| invoke-virtual {v3,v4,v5}, java.io.PrintStream.printf(java.lang.String, java.lang.Object[]):java.io.PrintStream .try_end_3 catch(...) : Label_5 45| move-result-object v3 .line 22 46| sget-object v3, java.lang.System.out 48| const-string v4, "finally\n" 50| const/4 v5, #+0 (0x00000000 | 0.00000) 51| new-array v5, v5, java.lang.Object[] 53| invoke-virtual {v3,v4,v5}, java.io.PrintStream.printf(java.lang.String, java.lang.Object[]):java.io.PrintStream 56| move-result-object v3 .line 23 57| goto/16 Label_2 Label_5: .line 22 .end_local v1 59| move-exception v3 60| move-object v2, v3 61| sget-object v3, java.lang.System.out 63| const-string v4, "finally\n" 65| const/4 v5, #+0 (0x00000000 | 0.00000) 66| new-array v5, v5, java.lang.Object[] 68| invoke-virtual {v3,v4,v5}, java.io.PrintStream.printf(java.lang.String, java.lang.Object[]):java.io.PrintStream 71| move-result-object v3 72| move-object v3, v2 73| throw v3 }