The link Beri provides explains the technical rules behind declaring exceptions thrown across methods. To answer your question of "why throws Exception":
In a concrete (might put "final" in here, but I won't) method one should almost never need to declare "throws Exception", because a concrete method will know exactly which exceptions it could possibly throw and should list those explicitly.
An abstract method/interface method is different. You have three choices:
- Don't declare any thrown exceptions. This means that the only exceptions that may be thrown by any implementation are RuntimeException. This implies no checked exceptions can be thrown and that it should, in almost all cases, be safe to call this method without expecting failure. If it does throw an exception, there's nothing you can do about it.
- Throw specific checked exceptions. This can be done, but it's going to be a rare few cases where an abstract method can correctly predict the exact limited set of checked exceptions that could be thrown. When writing a framework with plugins, this would be a way to specify checked exceptions the framework understands how to handle (e.g. IOException in stream classes, FileNotFound). The implication of doing so is that the defined set are the only checked exceptions that could ever occur or would make sense to occur.
- Throw Exception. In this case it's saying that a concrete implementation will be allowed to throw any checked exceptions that make sense for that implementation, with no restrictions. An implementation might choose to throw less (or none), but is allowed to throw any checked exception. It indicates that an implementation is allowed to throw any checked exception, and a caller will be required handle Exception.
It doesn't add much value. Why not? Because the value of checked exceptions is understanding the specific exceptions that could be thrown so that they can be meaningfully handled by the caller. When you are left with just "Exception", and no indication of what an implementation might throw (or, with multiple implementations, what might vary from one to another), there's no meaningful way to handle that more so than just handling Exception, which is really no more meaningful than just handling RuntimeException.
So the only real value of declaring an abstract method with "throws Exception" is to explicitly say "we require the caller to explicitly handle exceptions that may be thrown by this method, because we can't guarantee if the implementation is likely to throw them or not." So rather than hoping an implementation won't throw an exception, one must assume it does.