I know if java finds a line of code where it's guaranteed that control will never reach, then compiler reports unreachable code error.
consider following code.
static int method1() {
try{ return 1; }
catch(Exception e){ } // LINE-1
finally{ }
System.out.println("abc"); //LINE-2
return 2;
}
}
in above code
1 try block is guaranteed to exit by returning 1 but still lines after finally block (LINE-2 onwards) are reachable.
2. if i comment catch block (LINE-1), LINE-2 becomes unreachable.
Why is it so. Doesn't compiler able to see unconditional return in try block for case-1.

This is the relevant part of JLS 14.21:
A
trystatement can complete normally iff both of the following are true:
The
tryblock can complete normally or anycatchblock can complete normally.If the
trystatement has afinallyblock, then thefinallyblock can complete normally.
In this case, although your try block can't complete normally, it has a catch block that can complete normally. The finally block can also complete normally.
The try statement is reachable and can complete normally, therefore the statement after it is reachable.
If you remove the catch block, the first bullet in the above quoted section is no longer true - which means the try statement can't complete normally, and the statement following it is unreachable.
See more on this question at Stackoverflow