Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Ваша идея об установке переменной вне объема попытки/выгоды/наконец корректна.
не может быть больше чем одного исключения, распространяющего сразу.
Вы могли всегда устанавливать булев флаг в своей выгоде (выгодах). Я не знаю ни о каком "гладком" способе сделать это, но тогда я - больше парня .NET.
Используйте вход...
try {
stream.write(buffer);
} catch(IOException ex) {
if (LOG.isErrorEnabled()) { // You can use log level whatever you want
LOG.error("Something wrong: " + ex.getMessage(), ex);
}
throw ex;
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException ex) {
if (LOG.isWarnEnabled()) {
LOG.warn("Could not close in finally block", ex);
}
}
}
}
Вместо использования логического флага я бы сохранил ссылку на объект Exception. Таким образом, у вас не только есть способ проверить, произошло ли исключение (объект будет нулевым, если исключение не произошло), но вы также получите доступ к самому объекту исключения в вашем блоке finally, если исключение действительно произошло. Вам просто нужно не забыть установить объект ошибки во всех ваших блоках catch (в случае повторного создания ошибки).
Я думаю, что это отсутствующая функция языка C #, которую следует добавить. Блок finally должен поддерживать ссылку на базовый класс Exception аналогично тому, как его поддерживает блок catch, чтобы ссылка на распространяющееся исключение была доступна для блока finally. Это было бы простой задачей для компилятора ,