Производительность затрат на кодирование "разработки на основе исключений" в Java? - PullRequest
14 голосов
/ 02 февраля 2010

Существуют ли какие-либо издержки производительности при создании, создании и отлове исключений в Java?

Я планирую добавить «разработку на основе исключений» в более крупный проект. Я хотел бы разработать свои собственные исключения и включить их в свои методы, заставляя разработчиков ловить и выполнять соответствующую работу.

Например, если у вас есть способ получить пользователя из базы данных на основе имени.

public User getUser(String name);

Однако, возможно, что пользователь может быть нулевым, и обычно забывают проверить это перед использованием публичного метода пользователя.

User user = getUser("adam");

int age = user.getAge();

, что приведет к исключению NullPointerException и падению. Однако, если я сделал проверку, перед возвратом пользовательского объекта, если он нулевой, и выдал 'UserIsNullException':

public User getUser(String name) throws UserIsNullException;

Я заставляю разработчика думать и действовать:

try {

    User user = getUser("adam");

    int age = user.getAge();

}catch( UserIsNullException e) {

}

Это делает код намного более безопасным для непредвиденных сбоев и устраняет больше ошибок. Допустим, у веб-сайта сотни посетителей в час, и этот шаблон дизайна используется практически везде.

Как такой подход к дизайну повлияет на производительность? Преимущества перевешивают стоимость или это просто плохое кодирование?

Спасибо за любую помощь!

UPDATE! Чтобы быть ясным, мое внимание не заключено в обертку NullPointerException, как мог бы предложить мой пример. Цель состоит в том, чтобы заставить исполнителя написать попытку / поймать, сохраняя головную боль реального сбоя, поскольку:

пользователь == ноль

было забыто. Вопрос касается сравнения этих двух моделей дизайна:

int age;

try {

User user = getUser("adam");

age = user.getAge();

}catch( UserIsNullException e) {

age = 0;

}

против

int age;

User user = getUser("adam");

if( user != null ) {
age = user.getAge();
} else {
age = 0;
}

Ответы [ 14 ]

0 голосов
/ 08 февраля 2011

Исключения стоят дорого, потому что каждый раз, когда выдается исключение, трассировка стека должна быть создана и заполнена.

Представьте себе операцию переноса баланса, которая не выполняется в 1% случаев из-за нехватки средств. Даже при такой относительно низкой частоте отказов производительность может сильно пострадать. См. здесь с исходным кодом и результатами тестов.

0 голосов
/ 02 февраля 2010

Согласно вашему последнему редактированию. Я думаю (как предположил Тони), использование шаблона NullObject было бы более полезным здесь.

Рассмотрим третий сценарий:

class NullUser extends User {

    public static NullUser nullUser = new NullUser();

    private NullUser(){}

    public int getAge() {
        return 0;
    }
}

//Later...
int age;

User user = getUser("adam"); // return nullUser if not found.
age = user.getAge();         // no catch, no if/null check, pure polymorphism
0 голосов
/ 02 февраля 2010

Вы можете забыть об исключениях и избежать проблем с производительностью. Это заставляет ваш API говорить за себя.

int getUserAge(String userName) 
{
    int age = 0;
    UserSearchResult result = getUser(userName);
    if (result.getFoundUser())
    {
        User user = result.getUser();
        age = user.getAge();
    }
    return age;
}
0 голосов
/ 02 февраля 2010

Как такой подход повлияет на производительность?Выгоды перевешивают стоимость или это просто плохое кодирование?

Я бы сказал, что от этого стиля программирования почти нет пользы.Исключение следует понимать как (хорошо ...) исключение .Это должно происходить только в ненормальной ситуации.Как вы определяете «нормальную ситуацию» - довольно спорная мысль ...

...