Я думаю, что считается, что в качестве общего правила на Java (и, возможно, на любом языке с обработкой исключений) следует попытаться избежать использования обработки исключений, чтобы фактически обрабатывать бизнес-логику. В общем, если ожидается, что определенная ситуация должна произойти, нужно проверить ее и обработать ее более непосредственно, чем полагаться на обработку исключений, чтобы выполнить проверку для вас. Например, следующее не считается хорошей практикой:
try{
_map.put(myKey, myValue);
} catch(NullPointerException e){
_map = new HashMap<String, String>();
}
Вместо ленивой инициализации следует выполнить более подобное:
if(_map == null){
_map = new HashMap<String, String>();
}
_map.put(myKey, myValue);
Конечно, может быть гораздо более сложная логика, чем просто обработка ленивой инициализации. Поэтому, учитывая, что этот тип вещей обычно неодобрительно... когда, если вообще когда-либо, есть ли хорошая идея полагаться на исключение, происходящее для определенной бизнес-логики? Было бы правильным сказать, что любой случай, когда вы чувствуете себя вынужденным использовать этот подход, действительно подчеркивает слабость используемого API?