Because IOException is a checked exception, the code within the try must call a method that could throw an IOException.
Since your code in the try is empty, the compiler knows that there is no chance in heck that it will ever throw an IOException and therefore any code in the catch is unreachable.
Now, catching an unchecked exception, means that the compiler won't know whether that type of exception will be thrown or not.
We've actually been having an interesting discussion of this precise issue here. I think I agree with Jim that this is a compiler bug, at least with regard to standards compliance.