name | description | type | default value |
---|---|---|---|
option | policy on block contents | block policy | stmt |
tokens | blocks to check | subset of tokens LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_FOR, LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT, LITERAL_SWITCH. | all tokens |
To configure the check:
<module name="EmptyBlock"/>
To configure the check for the text policy and only try blocks:
<module name="EmptyBlock"> <property name="option" value="text"/> <property name="tokens" value="LITERAL_TRY"/> </module>
Checks for empty catch blocks. There are two options to make validation more precise (by default Check allows empty catch block with any comment inside):
name | description | type | default value |
---|---|---|---|
exceptionVariableName | The name of variable associated with exception | String | ^$ |
commentFormat | The format of the first comment inside empty catch | String | .* |
To configure the Check to suppress empty catch block if exception's variable name is expected or ignore or there's any comment inside:
<module name="EmptyCatchBlock"> <property name="exceptionVariableName" value="expected|ignore"/> </module>
To configure the Check to suppress empty catch block if single-line comment inside is "//This is expected":
<module name="EmptyCatchBlock"> <property name="commentFormat" value="This is expected"/> </module>
To configure the Check to suppress empty catch block if single-line comment inside is "//This is expected" or exception's variable name is "myException" (any option is matching):
<module name="EmptyCatchBlock"> <property name="commentFormat" value="This is expected"/> <property name="exceptionVariableName" value="myException"/> </module>
Such empty blocks would be suppressed:
try { throw new RuntimeException(); } catch (RuntimeException e) { //This is expected } ... try { throw new RuntimeException(); } catch (RuntimeException e) { // This is expected } ... try { throw new RuntimeException(); } catch (RuntimeException e) { // This is expected // some another comment } ... try { throw new RuntimeException(); } catch (RuntimeException e) { /* This is expected */ } ... try { throw new RuntimeException(); } catch (RuntimeException e) { /* * * This is expected * some another comment */ } ... try { throw new RuntimeException(); } catch (RuntimeException myException) { }
Checks for the placement of left curly braces ('{') for code blocks. The policy to verify is specified using the property option. Policies eol and nlow take into account the property maxLineLength.
name | description | type | default value |
---|---|---|---|
option | policy on placement of a left curly brace ('{') | left curly brace policy | eol |
ignoreEnums | If true, Check will ignore enums | boolean | true |
maxLineLength | maximum number of characters in a line | integer | 80 |
tokens | blocks to check | subset of tokens ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_DEF, ENUM_CONSTANT_DEF, INTERFACE_DEF, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF | all tokens |
To configure the check:
<module name="LeftCurly"/>
To configure the check to apply the nl policy to type blocks:
<module name="LeftCurly"> <property name="option" value="nl"/> <property name="tokens" value="CLASS_DEF,INTERFACE_DEF"/> </module>
An example of how to configure the check to validate enum definitions:
<module name="LeftCurly"> <property name="ignoreEnums" value="false"/> </module>
name | description | type | default value |
---|---|---|---|
tokens | blocks to check | subset of tokens LITERAL_DO, LITERAL_ELSE, LITERAL_IF, LITERAL_FOR, LITERAL_WHILE | all tokens |
allowSingleLineStatement | allows single-line statements without braces | boolean | false |
To configure the check:
<module name="NeedBraces"/>
To configure the check for if and else blocks:
<module name="NeedBraces"> <property name="tokens" value="LITERAL_IF, LITERAL_ELSE"/> </module>
To configure the check to allow single-line statements (if, while, do-while, for) without braces:
<module name="NeedBraces"> <property name="allowSingleLineStatement" value="true"/> </module>
Next statements won't be violated by Check:
if (obj.isValid()) return true; // OK while (obj.isValid()) return true; // OK do this.notify(); while (o != null); // OK for (int i = 0; ; ) this.notify(); // OK
To configure the Check to allow case, default single-line statements without braces:
<module name="NeedBraces"> <property name="tokens" value="LITERAL_CASE, LITERAL_DEFAULT"/> <property name="allowSingleLineStatement" value="true"/> </module>
Next statements won't be violated by Check:
switch (num) { case 1: counter++; break; // OK case 6: counter += 10; break; // OK default: counter = 100; break; // OK }
Checks the placement of right curly braces ('}') for else, try, and catch tokens. The policy to verify is specified using the property option.
name | description | type | default value |
---|---|---|---|
option | policy on placement of a right curly brace ('}') | right curly brace policy | same |
tokens | blocks to check | subset of tokens LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT. | LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE |
shouldStartLine | should we check if '}' starts line. | boolean | true |
To configure the check:
<module name="RightCurly"/>
To configure the check with policy alone for else and METHOD_DEF tokens:
<module name="RightCurly"> <property name="option" value="alone"/> <property name="tokens" value="LITERAL_ELSE, METHOD_DEF"/> </module>
Finds nested blocks, i.e. blocks that are used freely in the code.
Rationale: Nested blocks are often leftovers from the debugging process, they confuse the reader.
For example this Check finds the obsolete braces in
public void guessTheOutput() { int whichIsWhich = 0; { int whichIsWhich = 2; } System.out.println("value = " + whichIsWhich); }
and debugging / refactoring leftovers such as
// if (conditionThatIsNotUsedAnyLonger) { System.out.println("unconditional"); }
A case in a switch statement does not implicitly form a block. Thus to be able to introduce local variables that have case scope it is necessary to open a nested block. This is supported, set the allowInSwitchCase property to true and include all statements of the case in the block.
switch (a) { case 0: // Never OK, break outside block { x = 1; } break; case 1: // Never OK, statement outside block System.out.println("Hello"); { x = 2; break; } case 1: // OK if allowInSwitchCase is true { System.out.println("Hello"); x = 2; break; } }
name | description | type | default value |
---|---|---|---|
allowInSwitchCase | Allow nested blocks in case statements | boolean | false |