Java Look and Feel Unsupported [дубликат]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

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

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

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


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

4
задан Sejanus 19 January 2010 в 07:49
поделиться

2 ответа

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

InputStream in = null;
try {
  in = new InputStream(...);
  // do stuff
} catch (IOException e) {
  // do whatever
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (Exception e) {
    }
  }
}

Является ли это уродливым? Конечно. Это многословный? Конечно. Java 7 сделает его немного лучше с блоками ARM, но до тех пор вы застряли с указанным выше.

Вы также можете разрешить обработчику исключений:

public void doStuff() throws IOException {
  InputStream in = new InputStream(...);
  // do stuff
  in.close();
}

, хотя даже то close() следует, вероятно, обернуть в блок finally.

Но указанное выше объявление функции говорит, что этот метод может выдать IOException. Поскольку это проверенное исключение, вызывающей стороне этой функции потребуется catch это (или объявить ее так, чтобы ее вызывающий мог справиться с ней и т. Д.).

7
ответ дан cletus 4 September 2018 в 10:30
поделиться
  • 1
    & Quot; Handled & Quot; Я полагаю, это означает попробовать / поймать. И что "объявлено" в этом случае? – Sejanus 19 January 2010 в 07:41
  • 2
    Объявленные средства добавляются к сигнатуре метода в «бросках». пункт. – Stephen C 19 January 2010 в 08:03
  • 3
    Получил это сейчас, спасибо – Sejanus 19 January 2010 в 08:29
  • 4
    В случае, когда doStuff может генерировать исключение IOException, не исключено ли, что если исключение будет выброшено до запуска in.close (), doStuff вернется, а значение & quot; in & quot; ресурс никогда не будет закрыт? Вне doStuff нет ручки для закрытия ресурса. Если это правда, это основной анти-шаблон в Java Exceptions ... – twolfe18 4 January 2013 в 03:26

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

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

Ресурс должен обрабатываться правильно, который принимает форму:

acquire();
try {
    use();
} finally {
    release();
}

Никогда не помещайте acquire() в блоке try. Никогда не помещайте ничего между acquire() и try (кроме простого назначения). Не пытайтесь выпустить несколько ресурсов в одном блоке finally.

Итак, у нас есть две разные проблемы. К сожалению, синтаксис Java смешивает два. Правильный способ записи такого кода:

try {
    final FileOutputStream rawOut = new FileOutputStream(file);
    try {
        OutputStream out = new BufferedOutputStream(rawOut);
        ...
        out.flush();
    } finally {
        rawOut.close();
    }
} catch (FileNotFoundException exc) {
    ...do something not being able to create file...
} catch (IOException exc) {
    ...handle create file but borked - oops...
}
1
ответ дан Tom Hawtin - tackline 4 September 2018 в 10:30
поделиться
  • 1
    Спасибо, я всегда ценю хорошие советы по практике кодирования. – Sejanus 20 January 2010 в 10:56
  • 2
    Почему бы не поместить приобретение в блок try? – Brian Gordon 14 February 2013 в 23:18
  • 3
    @BrianGordon Если вы поместите покупку внутри try, вы запустите часть релиза (finally), даже если сбой окажется неудачным, что неверно. / Теперь вы можете попробовать некоторый код, чтобы проверить, удалось ли приобрести, и только затем запустить выпуск. Однако опыт показывает, что обычно пишется неправильно (и явно не проверяется), поэтому вы можете пойти и на более простой код. – Tom Hawtin - tackline 16 February 2013 в 18:52
Другие вопросы по тегам:

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