Если я ловлю исключения, выданные при закрытии java.sql. Соединение

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

14
задан Luuklag 13 October 2018 в 16:59
поделиться

11 ответов

На самом деле то, что Вы делаете, является (почти) лучшей практикой :-) вот то, что я видел в JdbcUtils.java Spring. Так, Вы могли бы хотеть добавить другой блок Выгоды.

/**
 * Close the given  ResultSet and ignore any thrown exception.
 * This is useful for typical finally blocks in manual  code.
 * @param resultSet the  ResultSet to close
 * @see javax.resource.cci.ResultSet#close()
 */
private void closeResultSet(ResultSet resultSet) {
  if (resultSet != null) {
    try {
      resultSet.close();
    }
    catch (SQLException ex) {
      logger.debug("Could not close  ResultSet", ex);
    }
    catch (Throwable ex) {
      // We don't trust the  driver: It might throw RuntimeException or Error.
      logger.debug("Unexpected exception on closing  ResultSet", ex);
    }
  }
}
13
ответ дан 1 December 2019 в 07:13
поделиться

В целом мне потратили впустую дни люди, выбрасывающие исключения как этот.

я рекомендую после нескольких основных правил за исключениями:

, Если Вы АБСОЛЮТНО УВЕРЕНЫ, что никогда не будете вызывать проблему с контролируемой исключительной ситуацией, ловить ПРОСТО, что исключение и комментирует точно, почему Вы не должны обрабатывать его. (Сон бросает InterruptedException, который может всегда игнорироваться, если Вы на самом деле не интересуетесь им, но честно это - единственный регистр, который я обычно игнорирую - даже в этом, если Вы никогда не получаете его, какова стоимость входа его?)

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

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

, Если Вы знаете точно, что вызывает исключение, поймайте его и зарегистрируйтесь точно, почему, Вам действительно не нужно отслеживание стека в этом случае, если Вы очень ясны относительно того, что вызывает его (и Вы могли бы упомянуть класс, это регистрирует его, если Вы уже не используете log4j или что-то.

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

Обновление: основная проблема здесь состоит в том, что Контролируемые исключительные ситуации нехороши. Единственный высоко используемый язык, в котором они существуют, является Java. Они аккуратны в теории, но в действии они вызывают это поведение выгоды и скрывают это, Вы не добираетесь за исключениями непроверенными.

Много людей прокомментировало то, что я сказал, что сокрытие их хорошо иногда. Чтобы быть конкретным, один случай, о котором я могу думать:

try {
    Thread.sleep(1000);
catch (InterruptedException e) {
    // I really don't care if this sleep is interrupted!
}

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

Это имело бы намного больше смысла иметь:

boolean interrupted=Thread.sleep(1000);

, Но они очень гордились своим новым шаблоном контролируемой исключительной ситуации, когда они сначала создали Java (понятно так, это действительно аккуратно в понятии - только перестал работать на практике)

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

12
ответ дан 1 December 2019 в 07:13
поделиться

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

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

6
ответ дан 1 December 2019 в 07:13
поделиться

Мне лично нравится Ваша вторая идея, по крайней мере, входа ошибки. Поскольку Вы ловите Исключение, теоретически возможно поймать что-то другое, чем Исключение SQL. Я не уверен, что могло произойти или как редкий (как из исключений памяти, и т.д.), но подавляющий все ошибки не кажется правильным мне.

, Если бы Вы хотите подавить ошибки, я сделал бы это только к очень определенным, которые Вы знаете, должен быть обработан тот путь.

ситуация Hypothecial: что, если бы Ваш sql имел открытую транзакцию и закрытие соединения, вызвало exceptino из-за этого, Вы хотели бы подавить ту ошибку? Даже подавление SQLExceptions могло бы быть немного опасным.

3
ответ дан 1 December 2019 в 07:13
поделиться

Необходимо обработать исключение. Это не плохая практика. Предположите потерю сети прежде, чем закрыть dabatase соединение. Это, вероятно, выдаст исключение.

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

необходимо также думать о том, возможно ли иметь пустое соединение в этой точке (это вызвало бы NullPointerException), или нет.

if (connection != null) {
   try { 
      connection.close(); 
   } catch (SQLException sqle) { 
      logger.log(e.getMessage(), e); 
   }
}
1
ответ дан 1 December 2019 в 07:13
поделиться

В идеальном мире Вы ничего никогда не должны делать на исключении, конечно, в идеальном мире, Вы никогда не получали бы исключение также 8-)

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

Журнал только: операции Базы данных все закончены, ничто, чтобы сделать, но очистить ресурсы. Если исключение происходит в этой точке, оно, скорее всего, не оказывает влияния на выполненную работу, так вход ошибки должен быть достаточным. Конечно, если ошибка происходит во время входа, то в основном необходимо обработать отказавшую операцию базы данных, которая на самом деле не перестала работать.

Пустой обработчик: операции Базы данных все закончены, ничто, чтобы сделать, но очистить ресурсы. Если исключение происходит в этой точке, оно, скорее всего, не оказывает влияния на выполненную работу, таким образом, метод возвращается успешно. Следующий доступ к базе данных может столкнуться с той же проблемой, но должно произойти в начале транзакции, где это справедливо перестанет работать и затем обрабатываться соответственно. Если проблема зафиксировала себя, то не будет никакого признака, что что-либо когда-либо шло не так, как надо.

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

, Конечно, мнения будут варьироваться.

1
ответ дан 1 December 2019 в 07:13
поделиться

Вы могли также бросить RuntimeException:

try {
    connection.close();
 } catch(Exception e) {
     throw new RuntimeException(e); 
 }

Вы не должны будете изменять свою сигнатуру метода и сможете использовать метод Exception.getCause позже для нахождения причины проблемы.

1
ответ дан 1 December 2019 в 07:13
поделиться

Обратите внимание, что Apache Commons DButils обеспечивает closeQuietly() метод, что можно использовать, чтобы не создавать помехи коду 'избыточными' выгодами. Обратите внимание, что я не рекомендую глотать исключения, но для этого close() сценарий я думаю, что это обычно приемлемо.

1
ответ дан 1 December 2019 в 07:13
поделиться

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

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

0
ответ дан 1 December 2019 в 07:13
поделиться

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

0
ответ дан 1 December 2019 в 07:13
поделиться

Если вы можете справиться с этим, сделайте это (и зарегистрируйте, если это было неожиданно). Если вы не можете справиться с этим, то повторно выбросьте его должным образом, чтобы код, приведенный выше, мог справиться с этим.

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

0
ответ дан 1 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: