UnusedLocalVariable
Since Checkstyle 9.3
Description
Checks that a local variable is declared and/or assigned, but not used. Supports pattern variables. Doesn't check array components as array components are classified as different kind of variables by JLS.
Properties
| name | description | type | default value | since |
|---|---|---|---|---|
| allowUnnamedVariables | Allow variables named with a single underscore (known as unnamed variables in Java 21+). | boolean | true |
10.18.0 |
| jdkVersion | Set the JDK version that you are using. Old JDK version numbering is supported (e.g. 1.8 for Java 8) as well as just the major JDK version alone (e.g. 8) is supported. This property only considers features from officially released Java versions as supported. Features introduced in preview releases are not considered supported until they are included in a non-preview release. Before JDK 22, named pattern variables in switch labels cannot be replaced with _, so violations on them are suppressed when jdkVersion is set below 22. |
int | 22 |
13.7.0 |
Examples
To configure the check:
<module name="Checker">
<module name="TreeWalker">
<module name="UnusedLocalVariable">
</module>
</module>
</module>
Example:
public class Example1 {
{
int k = 12; // violation, assign and update but never use 'k'
k++;
}
int a;
Example1(int a) { // ok, as 'a' is a constructor parameter not a local variable
this.a = 12;
}
void method(int b) {
int[] arr = {1, 2, 3}; // violation, unused named local variable 'arr'
int[] anotherArr = {1}; // ok, 'anotherArr' is accessed
anotherArr[0] = 4;
}
String convertValue(String newValue) {
String s = newValue.toLowerCase(); // violation, unused named local variable 's'
String _ = newValue.toLowerCase(); // ok, '_' is unnamed variable
return newValue.toLowerCase();
}
void read() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s; // violation, unused named local variable 's'
while ((s = reader.readLine()) != null) {}
try (BufferedReader reader1 = // ok, 'reader1' is a resource
new BufferedReader(new FileReader("abc.txt"))) {}
try {
} catch (Exception e) { } // ok, 'e' is an exception parameter
}
void loops() {
int j = 12;
for (int i = 0; j < 11; i++) // violation, unused named local variable 'i'
for (int p = 0; j < 11; p++) p /= 2; // ok, 'p' is used
for (Integer _ : new int[0]) { } // ok, '_' is unnamed variable
}
void lambdas() {
Predicate<String> obj = (String str) -> true; // ok, 'str' is a lambda parameter
obj.test("Test");
}
}
To configure the check to violate variables named with a single underscore if they are not used:
<module name="Checker">
<module name="TreeWalker">
<module name="UnusedLocalVariable">
<property name="allowUnnamedVariables" value="false"/>
</module>
</module>
</module>
Example:
public class Example2 {
{
int k = 12; // violation, assign and update but never use 'k'
k++;
}
int a;
Example2(int a) { // ok, as 'a' is a constructor parameter not a local variable
this.a = 12;
}
void method(int b) {
int[] arr = {1, 2, 3}; // violation, unused local variable 'arr'
int[] anotherArr = {1}; // ok, 'anotherArr' is accessed
anotherArr[0] = 4;
}
String convertValue(String newValue) {
String s = newValue.toLowerCase(); // violation, unused local variable 's'
String _ = newValue.toLowerCase(); // violation, unused local variable '_'
return newValue.toLowerCase();
}
void read() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s; // violation, unused local variable 's'
while ((s = reader.readLine()) != null) {}
try (BufferedReader reader1 = // ok, 'reader1' is a resource
new BufferedReader(new FileReader("abc.txt"))) {}
try {
} catch (Exception e) { } // ok, 'e' is an exception parameter
}
void loops() {
int j = 12;
for (int i = 0; j < 11; i++) // violation, unused local variable 'i'
for (int p = 0; j < 11; p++) p /= 2; // ok, 'p' is used
for (Integer _ : new int[0]) { } // violation, unused local variable '_'
}
void lambdas() {
Predicate<String> obj = (String str) -> true; // ok, 'str' is a lambda parameter
obj.test("Test");
}
}
Example with pattern variable:
<module name="Checker">
<module name="TreeWalker">
<module name="UnusedLocalVariable">
</module>
</module>
</module>
Example:
public class Example3 {
sealed abstract static class Shape permits Circle, Rect {}
static final class Circle extends Shape {}
static final class Rect extends Shape {}
void patternVariables(Object obj, Shape s) {
if (obj instanceof String str) {
} // violation above, unused named local variable 'str'
if (obj instanceof String t) { // ok, 't' is used
System.out.println(t);
}
if (obj instanceof String _) { // ok, '_' is unnamed variable
System.out.println("string");
}
switch (s) { // violation below, unused local variable 'c'
case Circle c -> System.out.println("circle");
case Rect r -> System.out.println(r); // ok, 'r' is used
default -> { }
}
}
}
Example:
<module name="Checker">
<module name="TreeWalker">
<module name="UnusedLocalVariable">
<property name="allowUnnamedVariables" value="false"/>
<property name="jdkVersion" value="21"/>
</module>
</module>
</module>
Example:
public class Example4 {
sealed abstract static class Shape permits Circle, Rect {}
static final class Circle extends Shape {}
static final class Rect extends Shape {}
void patternVariables(Object obj, Shape s) {
if (obj instanceof String str) { // violation, unused local variable 'str'
System.out.println("string");
}
if (obj instanceof String t) { // ok, 't' is used
System.out.println(t);
}
if (obj instanceof String _) { // ok, pattern variable '_' is always skipped
System.out.println("string");
}
switch (s) {
case Circle c -> System.out.println("circle");
case Rect r -> System.out.println(r); // ok, 'r' is used
default -> { }
}
}
}
Example of Usage
Violation Messages
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
Fully Qualified Name
com.puppycrawl.tools.checkstyle.checks.coding.UnusedLocalVariableCheck
Use this fully qualified class name in configuration when an exact class reference is required.






