##### Overview

- Download PMD 5.0.4
- What's new in PMD 5.0.4
- PMD in the news
- PMD-related products and books
- Best practices
- Future directions
- Similar projects
- Credits
- License
- What does 'PMD' mean?

##### Usage

- Installation
- Command line usage
- Ant task usage
- Maven plugin usage
- Mvn plugin usage
- IDE plugin usage
- Suppressing warnings
- Finding duplicated code
- JSP support

##### Customizing PMD

- Compiling PMD
- How to write a rule
- Writing XPath rules
- How to make a rule set
- How it works
- Rule guidelines
- PMD developers information
- PMD Release Process

##### For example

- Run PMD on a Sourceforge project

##### Misc.

- XPath tutorial (Gregorian)

##### Rule Sets

- ecmascript
  - Basic Ecmascript
  - Braces
  - Unnecessary
- java
  - Android
  - Basic
  - Braces
  - Clone Implementation
  - Code Size
  - Comments
  - Controversial
  - Coupling
  - Design
  - Empty Code
  - Finalizer
  - Import Statements
  - J2EE
  - JavaBeans
  - JUnit
  - Jakarta Commons Logging
  - Java Logging
  - Migration
  - Naming
  - Optimization
  - Strict Exceptions
  - String and StringBuffer
  - Security Code Guidelines
  - Type Resolution
  - Unnecessary
  - Unused Code
- jsp
  - Basic JSF
  - Basic JSP
- xml
  - Basic XML
- xsl
  - XPath in XSL

##### Project Documentation

- Project Information
- Project Reports

## Empty Code

The Empty Code ruleset contains rules that find empty statements of any kind (empty method, empty block statement, empty try or catch block,...).

### EmptyCatchBlock

Since: PMD 0.1

Empty Catch Block finds instances where an exception is caught, but nothing is done. In most circumstances, this swallows an exception which should either be acted on or reported.

    //CatchStatement
     [count(Block/BlockStatement) = 0 and ($allowCommentedBlocks != 'true' or Block/@containsComment = 'false')]
     [FormalParameter/Type/ReferenceType
       /ClassOrInterfaceType[@Image != 'InterruptedException' and @Image != 'CloneNotSupportedException']
     ]

Example(s):

    public void doSomething() {
      try {
        FileInputStream fis = new FileInputStream("/tmp/bugger");
      } catch (IOException ioe) {
          // not good
      }
    }

This rule has the following properties:

Name | Default Value | Description
allowCommentedBlocks | false | Empty blocks containing comments will be skipped

### EmptyIfStmt

Since: PMD 0.1

Empty If Statement finds instances where a condition is checked but nothing is done about it.

    //IfStatement/Statement
     [EmptyStatement or Block[count(*) = 0]]

Example(s):

    public class Foo {
     void bar(int x) {
      if (x == 0) {
       // empty!
      }
     }
    }

### EmptyWhileStmt

Since: PMD 0.2

Empty While Statement finds all instances where a while statement does nothing. If it is a timing loop, then you should use Thread.sleep() for it; if it is a while loop that does a lot in the exit expression, rewrite it to make it clearer.

    //WhileStatement/Statement[./Block[count(*) = 0]  or ./EmptyStatement]

Example(s):

    void bar(int a, int b) {
    	while (a == b) {
    	// empty!
    	}
    }

### EmptyTryBlock

Since: PMD 0.4

Avoid empty try blocks - what's the point?

    //TryStatement/Block[1][count(*) = 0]

Example(s):

    public class Foo {
     public void bar() {
      try {
      } catch (Exception e) {
        e.printStackTrace();
      }
     }
    }

### EmptyFinallyBlock

Since: PMD 0.4

Empty finally blocks serve no purpose and should be removed.

    //FinallyStatement[count(Block/BlockStatement) = 0]

Example(s):

    public class Foo {
     public void bar() {
      try {
        int x=2;
       } finally {
        // empty!
       }
     }
    }

### EmptySwitchStatements

Since: PMD 1.0

Empty switch statements serve no purpose and should be removed.

    //SwitchStatement[count(*) = 1]

Example(s):

    public void bar() {
    	int x = 2;
    	switch (x) {
    	// once there was code here
    	// but it's been commented out or something
    	}
    }

### EmptySynchronizedBlock

Since: PMD 1.3

Empty synchronized blocks serve no purpose and should be removed.

    //SynchronizedStatement/Block[1][count(*) = 0]

Example(s):

    public class Foo {
     public void bar() {
      synchronized (this) {
       // empty!
      }
     }
    }

### EmptyStatementNotInLoop

Since: PMD 1.5

An empty statement (or a semicolon by itself) that is not used as the sole body of a 'for' or 'while' loop is probably a bug. It could also be a double semicolon, which has no purpose and should be removed.

    //EmptyStatement
     [not(
           ../../../ForStatement
           or ../../../WhileStatement
           or ../../../BlockStatement/ClassOrInterfaceDeclaration
           or ../../../../../../ForStatement/Statement[1]
            /Block[1]/BlockStatement[1]/Statement/EmptyStatement
           or ../../../../../../WhileStatement/Statement[1]
            /Block[1]/BlockStatement[1]/Statement/EmptyStatement)
     ]

Example(s):

    public void doit() {
          // this is probably not what you meant to do
          ;
          // the extra semicolon here this is not necessary
          System.out.println("look at the extra semicolon");;
    }

### EmptyInitializer

Since: PMD 5.0

Empty initializers serve no purpose and should be removed.

    //Initializer/Block[count(*)=0]

Example(s):

    public class Foo {

       static {} // Why ?

       {} // Again, why ?

    }

### EmptyStatementBlock

Since: PMD 5.0

Empty block statements serve no purpose and should be removed.

    //BlockStatement/Statement/Block[count(*) = 0]

Example(s):

    public class Foo {

       private int _bar;

       public void setBar(int bar) {
          { _bar = bar; } // Why not?
          {} // But remove this.
       }

    }

### EmptyStaticInitializer

Since: PMD 1.5

An empty static initializer serve no purpose and should be removed.

    //Initializer[@Static='true']/Block[count(*)=0]

Example(s):

    public class Foo {
    	static {
    	// empty
    	}
    }