This is a matter of style if you disregard the small runtime penalties given by the exception handlers.
One could design a stack type like
try{
while(true){
try{
stack.pop();
catch(StackElement e){
processElement(e);
}
}
catch(EmptyStackException ese){
// probably not much to do here.
}
Consensus is, for reasons of readability and common sense, that the usual if
condition makes things easier to understand. The exception mechanism should be used for exceptional situations, not for regular flow control.
In your particular example of find, you have two cases, none of them are out of the ordinary. So an exception is probably unnecessary.
1 - didn't find the element.
2 - found the element.
Case 2 requires extra attention as your version of find also wants to return the actual element.
1 || 2 is a boolean situation. So that should not be an element. find() for case 2 should be an element.
I've always disliked the return null for a non value. It makes for ugly code. Just recall
void f(BufferedReader br){
String line;
while( (line = br.readLine()) != null)
Better is to separate the boolean from the element.
if( list.has(foo) ){
E element = list.get(foo);
}