When the scanner fails to read the integer, it does not clear the input buffer. So let's say the input buffer contains "abc" because that's what you entered. The call to "nextInt" will fail, but the buffer will still contain "abc". So on the next pass of the loop, the "nextInt" will fail again!
Calling sc.next() in your exception Handler should correct the problem, by removing the incorrect token from the buffer.