Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Для инструментов статического анализа я часто использую CPD, PMD, FindBugs, и Checkstyle.
CPD является инструментом "Copy/Paste Detector" PMD. Я использовал PMD на некоторое время, прежде чем я заметил "Открытие Дублированный Код" ссылка на веб-страница PMD .
я хотел бы указать, что эти инструменты могут иногда расширяться вне их "out-of-the-box" ряда правил. И не только, потому что они - открытый исходный код так, чтобы можно было переписать их. Некоторые из этих инструментов идут с приложениями или "рычагами", которые позволяют им быть расширенными. Например, PMD идет инструмент "разработчика" , который позволяет Вам создавать новые правила. Кроме того, Checkstyle имеет проверка DescendantToken, которая имеет свойства, которые допускают существенную настройку.
я интегрирую эти инструменты с [1 132] Основанная на муравье сборка . Можно перейти по ссылке для наблюдения моей прокомментированной конфигурации.
В дополнение к простой интеграции в сборку, я нахожу полезным настроить инструменты, которые будут несколько "интегрированы" несколькими другими способами. А именно, сообщите о поколении и предупреждении однородности подавления. Я хотел бы добавить эти аспекты к этому обсуждению (который должен, вероятно, иметь тег "статического анализа" также): как люди настраивают эти инструменты для создания "объединенного" решения? (Я задал этот вопрос отдельно здесь )
Первый, для предупреждения отчетов, я преобразовываю вывод так, чтобы каждое предупреждение имело простой формат:
/absolute-path/filename:line-number:column-number: warning(tool-name): message
Это часто называют "форматом Emacs", но даже если Вы не используете Emacs, это - разумный формат для гомогенизации отчетов. Например:
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
Мое предупреждение преобразований формата сделаны моим скриптом Ant с Муравьем filterchains.
вторая "интеграция", которую я делаю, для предупреждения подавления. По умолчанию каждый инструмент поддерживает комментарии или аннотацию (или оба), что можно поместить в коде для глушения предупреждения, что Вы хотите проигнорировать. Но эти различные запросы подавления предупреждения не имеют последовательного взгляда, который кажется несколько глупым. При подавлении предупреждения Вы подавляете предупреждение, итак, почему не всегда пишут" SuppressWarning
?"
, Например, конфигурация PMD по умолчанию подавляет предупреждение поколения на строках кода со строкой" NOPMD
" в комментарии. Кроме того, PMD поддерживает Java @SuppressWarnings
аннотация. Я настраиваю PMD для использования комментариев, содержащих" SuppressWarning(PMD.
" вместо [1 110] так, чтобы подавления PMD выглядели подобными. Я заполняю конкретное правило, которое нарушено при использовании подавления стиля комментария:
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
Только" SuppressWarnings(PMD.
" часть является значительной для комментария, но это согласовывается с поддержкой PMD @SuppressWarning
аннотация, которая действительно распознает отдельные нарушения правила по имени:
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
Точно так же Checkstyle подавляет предупреждение поколения между парами комментариев (никакая поддержка аннотации не оказывается). По умолчанию комментарии для выключения и включения Checkstyle содержат строки CHECKSTYLE:OFF
и CHECKSTYLE:ON
, соответственно. Изменение этой конфигурации (с "SuppressionCommentFilter" Checkstyle) для использования строк" BEGIN SuppressWarnings(CheckStyle.
" и" END SuppressWarnings(CheckStyle.
" заставляет средства управления посмотреть больше как PMD:
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
С комментариями Checkstyle, конкретное нарушение проверки (HiddenField
) значительно, потому что каждая проверка имеет свое собственное" BEGIN/END
" пара комментария.
FindBugs также поддерживает предупреждение подавления поколения с @SuppressWarnings
аннотация, таким образом, никакая дальнейшая конфигурация не требуется, чтобы достигать некоторого уровня однородности с другими инструментами. К сожалению, Findbugs должен поддерживать пользовательское @SuppressWarnings
аннотация, потому что встроенная аннотация Java @SuppressWarnings
имеет SOURCE
политика хранения, которая не достаточно сильна для сохранения аннотации в файле класса, где FindBugs нужен он. Я полностью определяю подавления предупреждений FindBugs, чтобы не сталкиваться с Java @SuppressWarnings
аннотация:
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
Эти методы заставляет вещи выглядеть довольно последовательными через инструменты. Обратите внимание, что наличие каждого подавления предупреждения содержит строку" SuppressWarnings
", облегчает запускать простой поиск для нахождения всех экземпляров для всех инструментов по всей кодовой базе.
Я использую комбинацию Cobertura, Checkstyle, (Ecl)Emma и Findbugs.
EclEmma потрясающий плагин Eclipse, который показывает покрытие кода путем окраски источника Java в редакторе ( снимок экрана ) - покрытие сгенерировано путем запущения теста JUnit. Это действительно полезно, когда Вы пытаетесь выяснить, какие строки покрыты конкретным классом, или если Вы хотите видеть, какие строки покрыты единственным тестом. Это намного более удобно для пользователя и полезно, чем генерация отчета и затем просмотр отчета видеть, какие классы имеют низкое покрытие.
плагины Checkstyle и Findbugs Eclipse также полезны, они генерируют предупреждения в редакторе, как Вы вводите.
Maven2 имеет плагины отчета, которые работают с вышеупомянутыми инструментами для генерации отчетов во время изготовления. Мы используем это для получения полных отчетов по проекту, которые более полезны, когда Вы хотите совокупные числа. Они сгенерированы нашими сборками CI, которые выполняют использование Континуум .
Я использую статический анализ, встроенный в ИДЕЮ IntelliJ. Идеальная интеграция.
я использую покрытие кода, встроенное в ИДЕЮ Intellij (на основе EMMA). Снова, идеальная интеграция.
Это интегрированное решение надежно, мощно, и просто в использовании по сравнению с соединением инструментов от различных поставщиков.
Все следующие мы используем и интегрируем easiy и в нашем Знатоке 2.x сборки и в Eclipse/RAD 7:
, Кроме того, в нашем Знатоке, мы имеем:
, Кроме того, при использовании Знатока 2.x CodeHaus имеет набор удобных плагинов Знатока в их проект .
Mojo Примечание: Клевер имеет out-of-the-box интеграцию с Бамбуком сервер CI (так как они - оба продукты Atlassian). Существуют также Бамбуковые плагины для FindBugs, PMD и CheckStyle, но, как отмечено, свободный сервер Hudson CI имеет тех также.
Checkstyle - другой, я использовал в предыдущей компании..., это главным образом для проверки стиля, но это может сделать некоторый статический анализ также. Кроме того, Clover для покрытия кода, хотя знать, что это не бесплатный инструмент.
Мы используем FindBugs и Checkstyle, а также Clover для Покрытия Кода.
я думаю, что важно иметь некоторый статический анализ, поддерживая Вашу разработку. К сожалению, это широко все еще не распространено, что эти инструменты важны.
Мы используем FindBugs и JDepend, интегрированный с Муравьем. Мы используем JUnit, но мы не используем инструмента покрытия.
я не использую интегрированный для Рационального Разработчика приложений (IDE, который я использую для разработки приложений J2EE), потому что мне нравится, как аккуратный это смотрит при выполнении javac в консоли Windows.: P
Мне везло с Cobertura. Это - инструмент покрытия кода, который может быть выполнен через Ваш скрипт Ant как часть Вашей нормальной сборки и может быть интегрирован в Гудзон.
Наши команды используют PMD и Cobertura, на самом деле наши проекты являются проектами знатока, и там очень просто включать разъем ins для анализа кода. Реальный вопрос был бы для определенного проекта, какой анализ необходимо использовать, мое мнение - то, что это - Вы, не мог использовать те же плагины для каждого проекта.
Я ищу много ответов, чтобы узнать о новых инструментах и консолидировать это знание в одном вопросе/потоке, таким образом, я сомневаюсь, что будет 1 истинный ответ на этот вопрос.
Мой ответ на мой собственный вопрос - то, что мы используем:
, Гудзон также имеет плагин сканера задачи, который отобразит количество TODO и FIXMEs, а также покажет, где они находятся в исходных файлах.
Все интегрированы со Знатоком 1.x в нашем случае и наброшены Гудзон, который выполняет наши сборки на регистрации, а также дополнительных вещах ночью и еженедельно. Гудзонская тенденция изображает в виде графика наши тесты JUnit, покрытие, findbugs, а также открытые задачи. Существует также Гудзонский плагин, который сообщает и изображает наши предупреждения компиляции в виде графика. У нас также есть несколько тестов производительности с их собственными графиками производительности и использования памяти, со временем использование Гудзона выводит плагин на печать также.
В нашем проекте мы используем Sonar перед checkstyle, pmd.... вместе с CI (Bamboo, Hudson) мы также получаем хорошую историю качества нашего источника и направления, в котором мы идем. Мне нравится Sonar, потому что это один центральный инструмент в стеке CI, который делает это за вас, и вы можете легко настроить правила для каждого проекта.