Какие инструменты анализа кода Вы используете для своих проектов Java? [закрытый]

Другое событие 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));
}

112
задан Bill the Lizard 9 August 2012 в 03:29
поделиться

11 ответов

Для инструментов статического анализа я часто использую 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", облегчает запускать простой поиск для нахождения всех экземпляров для всех инструментов по всей кодовой базе.

69
ответ дан Community 24 November 2019 в 02:53
поделиться

Я использую комбинацию Cobertura, Checkstyle, (Ecl)Emma и Findbugs.

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

плагины Checkstyle и Findbugs Eclipse также полезны, они генерируют предупреждения в редакторе, как Вы вводите.

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

16
ответ дан Ken Liu 24 November 2019 в 02:53
поделиться

Я использую статический анализ, встроенный в ИДЕЮ IntelliJ. Идеальная интеграция.

я использую покрытие кода, встроенное в ИДЕЮ Intellij (на основе EMMA). Снова, идеальная интеграция.

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

9
ответ дан Steve McLeod 24 November 2019 в 02:53
поделиться

Все следующие мы используем и интегрируем easiy и в нашем Знатоке 2.x сборки и в Eclipse/RAD 7:

  • Тестирование - анализ кода JUnit/TestNG
  • - FindBugs, покрытие Кода PMD
  • - который создает Клевер

, Кроме того, в нашем Знатоке, мы имеем:

  • средство проверки Тега JDepend
  • (TODO, FIXME, и т.д.)

, Кроме того, при использовании Знатока 2.x CodeHaus имеет набор удобных плагинов Знатока в их проект .

Mojo Примечание: Клевер имеет out-of-the-box интеграцию с Бамбуком сервер CI (так как они - оба продукты Atlassian). Существуют также Бамбуковые плагины для FindBugs, PMD и CheckStyle, но, как отмечено, свободный сервер Hudson CI имеет тех также.

11
ответ дан Brian Laframboise 24 November 2019 в 02:53
поделиться

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

4
ответ дан Mike Stone 24 November 2019 в 02:53
поделиться

Мы используем FindBugs и Checkstyle, а также Clover для Покрытия Кода.

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

3
ответ дан dlinsin 24 November 2019 в 02:53
поделиться

Мы используем FindBugs и JDepend, интегрированный с Муравьем. Мы используем JUnit, но мы не используем инструмента покрытия.

я не использую интегрированный для Рационального Разработчика приложений (IDE, который я использую для разработки приложений J2EE), потому что мне нравится, как аккуратный это смотрит при выполнении javac в консоли Windows.: P

1
ответ дан ggasp 24 November 2019 в 02:53
поделиться

Мне везло с Cobertura. Это - инструмент покрытия кода, который может быть выполнен через Ваш скрипт Ant как часть Вашей нормальной сборки и может быть интегрирован в Гудзон.

1
ответ дан Randyaa 24 November 2019 в 02:53
поделиться

Наши команды используют PMD и Cobertura, на самом деле наши проекты являются проектами знатока, и там очень просто включать разъем ins для анализа кода. Реальный вопрос был бы для определенного проекта, какой анализ необходимо использовать, мое мнение - то, что это - Вы, не мог использовать те же плагины для каждого проекта.

1
ответ дан vaske 24 November 2019 в 02:53
поделиться

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

Мой ответ на мой собственный вопрос - то, что мы используем:

  • Findbugs для поиска плохих распространенных ошибок / кодирование - выполненный от знатока, и также интегрируется легко в Eclipse
  • Cobertura для наших отчетов о покрытии - выполненный от знатока

, Гудзон также имеет плагин сканера задачи, который отобразит количество TODO и FIXMEs, а также покажет, где они находятся в исходных файлах.

Все интегрированы со Знатоком 1.x в нашем случае и наброшены Гудзон, который выполняет наши сборки на регистрации, а также дополнительных вещах ночью и еженедельно. Гудзонская тенденция изображает в виде графика наши тесты JUnit, покрытие, findbugs, а также открытые задачи. Существует также Гудзонский плагин, который сообщает и изображает наши предупреждения компиляции в виде графика. У нас также есть несколько тестов производительности с их собственными графиками производительности и использования памяти, со временем использование Гудзона выводит плагин на печать также.

0
ответ дан Joshua McKinnon 24 November 2019 в 02:53
поделиться

В нашем проекте мы используем Sonar перед checkstyle, pmd.... вместе с CI (Bamboo, Hudson) мы также получаем хорошую историю качества нашего источника и направления, в котором мы идем. Мне нравится Sonar, потому что это один центральный инструмент в стеке CI, который делает это за вас, и вы можете легко настроить правила для каждого проекта.

1
ответ дан 24 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

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