It's a good idea to declare every type of exception you expect to throw, even those that are runtime exceptions.
One of the reasons for this is Javadoc. Imagine you have something like this.
public void foo( String bar ) throws NullPointerException, IllegalArgumentException { if (bar == null) { throw new NullPointerException( "bar must not be null" ); } if (bar.equals( "123" ) { throw new IllegalArgumentException ( "bar must not have valu 123" ); } ... }
And in your Javadoc you can document exactly what is thrown when. This is incredibly useful for users of your code, even if they don't want to handle them differently. (Of course you can add the @throws tags to the Javadoc manually, but it's better to be prompted.)
Before Java 7, dealing with many exceptions in one catch was quite complicated, which tempted developers to simplify their throws clauses but there's no justification for that any more.
Try-multi-catch:
try { getClientByNumber(Long number); } catch ( ClientNotFoundException | NotUniqueResultException ex ) { ... }
This eliminates the need to repeat your catch block (or even worse, catch Exception).
Re-throwing made easy
If for some reason you do want to catch every exception, log it and re-throw it, you can do this:
public void foo() throws ClientNotFoundException, NotUniqueResultException { try { getClientByNumber(Long number); } catch ( Exception ex ) { ... throw ex; //the compiler knows that at this point `ex` is either an unchecked exception, or one of the two declared checked exceptions, therefore this re-throw is valid } }