Convert Figma logo to code with AI

google logoerror-prone

Catch common Java mistakes as compile-time errors

6,825
739
6,825
390

Top Related Projects

Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. By default it supports the Google Java Style Guide and Sun Code Conventions, but is highly configurable. It can be invoked with an ANT task and a command line program.

SpotBugs is FindBugs' successor. A tool for static analysis to look for bugs in Java code.

4,797

An extensible multilanguage static code analyzer.

6,200

Static code analysis for Kotlin

14,889

A static analyzer for Java, C, C++, and Objective-C

Continuous Inspection

Quick Overview

Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time. Developed by Google, it integrates with the Java compiler to provide additional error checking and suggestions for improvement, helping developers write more reliable and maintainable code.

Pros

  • Catches bugs and potential issues early in the development process
  • Integrates seamlessly with existing Java build tools and IDEs
  • Provides clear and actionable error messages with suggested fixes
  • Customizable and extensible, allowing teams to add their own checks

Cons

  • May increase compilation time, especially for large projects
  • Some checks might be overly strict for certain coding styles or project requirements
  • Learning curve for developers to understand and effectively use all available checks
  • Occasional false positives that require manual review or suppression

Code Examples

  1. Using the @Nullable annotation to prevent null pointer exceptions:
import org.checkerframework.checker.nullness.qual.Nullable;

public class Example {
    @Nullable String maybeNull;
    
    public void processString(@Nullable String input) {
        if (input != null) {
            System.out.println(input.length());
        }
    }
}
  1. Using @CompileTimeConstant to ensure a parameter is a compile-time constant:
import com.google.errorprone.annotations.CompileTimeConstant;

public class Example {
    public void log(@CompileTimeConstant String message) {
        System.out.println(message);
    }
}
  1. Using @CanIgnoreReturnValue to indicate that ignoring the return value is acceptable:
import com.google.errorprone.annotations.CanIgnoreReturnValue;

public class Example {
    @CanIgnoreReturnValue
    public boolean tryOperation() {
        // Perform operation
        return true;
    }
}

Getting Started

To use Error Prone with Maven, add the following to your pom.xml:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
      <configuration>
        <source>8</source>
        <target>8</target>
        <compilerArgs>
          <arg>-XDcompilePolicy=simple</arg>
          <arg>-Xplugin:ErrorProne</arg>
        </compilerArgs>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.errorprone</groupId>
            <artifactId>error_prone_core</artifactId>
            <version>2.10.0</version>
          </path>
        </annotationProcessorPaths>
      </configuration>
    </plugin>
  </plugins>
</build>

Then run mvn clean compile to see Error Prone in action.

Competitor Comparisons

Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. By default it supports the Google Java Style Guide and Sun Code Conventions, but is highly configurable. It can be invoked with an ANT task and a command line program.

Pros of Checkstyle

  • More extensive and customizable set of coding style checks
  • Supports multiple programming languages beyond Java
  • Integrates well with various build tools and IDEs

Cons of Checkstyle

  • Primarily focused on style checks rather than bug detection
  • Can be more complex to configure and maintain
  • May require more manual intervention to address issues

Code Comparison

Error-prone example:

@Nullable String name;
if (name.isEmpty()) { // Error-prone catches potential NPE
  // ...
}

Checkstyle example:

public class MyClass { // Checkstyle enforces naming conventions
    private int myVariable; // Checkstyle checks variable naming
    
    public void myMethod() { // Checkstyle checks method naming
        // ...
    }
}

Error-prone focuses on detecting potential bugs and runtime issues, while Checkstyle primarily enforces coding style and conventions. Error-prone is more oriented towards improving code correctness, whereas Checkstyle aims to maintain consistent code style across projects. Both tools can be valuable in a development workflow, often used in conjunction to ensure both code quality and style consistency.

SpotBugs is FindBugs' successor. A tool for static analysis to look for bugs in Java code.

Pros of SpotBugs

  • Wider language support, including Java, Groovy, and Scala
  • Extensive plugin ecosystem for additional bug patterns and integrations
  • GUI for standalone analysis and result visualization

Cons of SpotBugs

  • Slower analysis compared to Error Prone
  • May produce more false positives, requiring manual filtering
  • Less seamless integration with the build process

Code Comparison

SpotBugs (using FindBugs annotations):

@CheckForNull
public String getName() {
    return name;
}

Error Prone:

@Nullable
public String getName() {
    return name;
}

Both tools aim to improve code quality, but they approach the task differently. Error Prone focuses on compile-time checks and integrates directly with the Java compiler, while SpotBugs performs post-compilation analysis.

Error Prone is generally faster and produces fewer false positives, making it more suitable for continuous integration environments. However, SpotBugs offers more flexibility in terms of supported languages and customization options.

The code comparison shows how both tools can be used to annotate nullable methods, with SpotBugs using FindBugs annotations and Error Prone using its own set of annotations.

Ultimately, the choice between these tools depends on project requirements, team preferences, and the specific types of issues you want to detect and prevent in your codebase.

4,797

An extensible multilanguage static code analyzer.

Pros of PMD

  • Supports multiple programming languages (Java, JavaScript, Apex, PL/SQL, etc.)
  • Offers a wide range of rule sets for various coding standards and best practices
  • Provides a graphical user interface for easier configuration and usage

Cons of PMD

  • Can be slower in analysis compared to Error Prone
  • May produce more false positives, requiring careful configuration
  • Less tightly integrated with the build process compared to Error Prone

Code Comparison

PMD rule example:

<rule name="AvoidDeeplyNestedIfStmts"
      language="java"
      message="Deeply nested if..then statements are hard to read"
      class="net.sourceforge.pmd.lang.java.rule.design.AvoidDeeplyNestedIfStmtsRule">
    <description>
        Deeply nested if..then statements are hard to read.
    </description>
    <priority>3</priority>
</rule>

Error Prone check example:

@BugPattern(
    name = "DeepNestedBlocks",
    summary = "Deeply nested blocks are hard to read and maintain",
    severity = WARNING)
public class DeepNestedBlocksChecker extends BugChecker implements MethodTreeMatcher {
  // Implementation details
}

Both tools aim to improve code quality, but PMD offers broader language support and more customizable rules, while Error Prone provides tighter Java integration and potentially faster analysis.

6,200

Static code analysis for Kotlin

Pros of detekt

  • Specifically designed for Kotlin, offering tailored static code analysis
  • Highly configurable with custom rulesets and easy integration into Gradle builds
  • Provides a wide range of code smell detections beyond just error prevention

Cons of detekt

  • Limited to Kotlin projects, lacking support for Java or other JVM languages
  • May have a steeper learning curve for teams not familiar with Kotlin-specific concepts

Code Comparison

detekt:

val threshold = 10
if (value > threshold) {
    // Detekt can detect magic numbers and suggest constants
}

error-prone:

int threshold = 10;
if (value > threshold) {
    // Error Prone focuses more on potential bugs and errors
}

Key Differences

  • Language focus: detekt is Kotlin-specific, while error-prone primarily targets Java
  • Scope: detekt emphasizes code style and smell detection, error-prone focuses on bug prevention
  • Integration: detekt integrates seamlessly with Gradle, error-prone works well with Maven and Bazel

Both tools aim to improve code quality, but they cater to different languages and have slightly different focuses in their analysis approach. Teams should choose based on their primary development language and specific code quality needs.

14,889

A static analyzer for Java, C, C++, and Objective-C

Pros of Infer

  • Supports multiple languages (Java, C/C++, Objective-C)
  • Performs inter-procedural and inter-file analysis
  • Capable of detecting complex issues like memory leaks and race conditions

Cons of Infer

  • Slower analysis compared to Error Prone
  • Steeper learning curve and more complex setup
  • May produce more false positives in certain scenarios

Code Comparison

Error Prone example:

@Nullable String name;
void greet() {
  System.out.println("Hello, " + name.toLowerCase());
}

Infer example:

@Nullable String name;
void greet() {
  if (name != null) {
    System.out.println("Hello, " + name.toLowerCase());
  }
}

In this comparison, Error Prone would flag the potential null pointer dereference in the first example. Infer, on the other hand, can perform more sophisticated analysis to determine if the null check in the second example is sufficient to prevent the issue.

Both tools aim to improve code quality, but they differ in their approach and capabilities. Error Prone focuses on quick, compile-time checks for Java, while Infer offers more comprehensive analysis across multiple languages at the cost of increased complexity and analysis time.

Continuous Inspection

Pros of SonarQube

  • Comprehensive code quality and security analysis across multiple languages
  • Provides a web-based dashboard for easy visualization of code quality metrics
  • Integrates with various CI/CD tools and supports plugins for extended functionality

Cons of SonarQube

  • Requires more setup and infrastructure compared to Error Prone
  • Can be resource-intensive, especially for large codebases
  • Learning curve for configuring and customizing rules

Code Comparison

Error Prone (Java):

@BugPattern(summary = "Prefer StringBuilder over string concatenation", severity = WARNING)
public class StringConcatenationChecker extends BugChecker implements BinaryTreeMatcher {
  // Implementation details
}

SonarQube (Custom rule in Java):

@Rule(key = "MyCustomRule")
public class MyCustomRule extends BaseTreeVisitor implements JavaFileScanner {
  private JavaFileScannerContext context;

  @Override
  public void scanFile(JavaFileScannerContext context) {
    this.context = context;
    scan(context.getTree());
  }
  // Additional implementation
}

While Error Prone focuses on compile-time error checking for Java, SonarQube offers a broader range of analysis across multiple languages and provides a more comprehensive code quality management platform. Error Prone is lightweight and integrates directly into the build process, whereas SonarQube requires more setup but offers extensive reporting and visualization capabilities.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Error Prone

Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time.

public class ShortSet {
  public static void main (String[] args) {
    Set<Short> s = new HashSet<>();
    for (short i = 0; i < 100; i++) {
      s.add(i);
      s.remove(i - 1);
    }
    System.out.println(s.size());
  }
}
error: [CollectionIncompatibleType] Argument 'i - 1' should not be passed to this method;
its type int is not compatible with its collection's type argument Short
      s.remove(i - 1);
              ^
    (see https://errorprone.info/bugpattern/CollectionIncompatibleType)
1 error

Getting Started

Our documentation is at errorprone.info.

Error Prone works with Bazel, Maven, Ant, and Gradle. See our installation instructions for details.

Developing Error Prone

Developing and building Error Prone is documented on the wiki.

Links