The compiler doesn't mind if you try to catch Exception or Throwable because what you might be catching is an unchecked exception that the compiler is not going to look for in your code. For example, something in the try block might throw a RuntimeException or an Error which would be caught by catch (Throwable t). The compiler doesn't care whether there's anything in the try block that could throw either of those. It just assumes that it's possible.
However, when you specify that you are catching something that can only be a checked exception, such as IOException, then the compiler will only allow it if it actually might be thrown by code in the try block. [ May 05, 2005: Message edited by: Joe Sanowitz ]