Active/Severity | Name [expand / collapse] | Sort by: | ||
---|---|---|---|---|
The usual convention for
Obtaining the object that will be returned by calling
For example, the following code: class BaseClass implements Cloneable { @Override public Object clone() throws CloneNotSupportedException { // Non-Compliant - should return the super.clone() instance return new BaseClass(); } } class DerivedClass extends BaseClass implements Cloneable { /* Does not override clone() */ public void sayHello() { System.out.println("Hello, world!"); } } class Application { public static void main(String[] args) throws Exception { DerivedClass instance = new DerivedClass(); ((DerivedClass) instance.clone()).sayHello(); // Throws a ClassCastException because invariant #2 is violated } } should be refactored into: class BaseClass implements Cloneable { @Override public Object clone() throws CloneNotSupportedException { // Compliant return super.clone(); } } class DerivedClass extends BaseClass implements Cloneable { /* Does not override clone() */ public void sayHello() { System.out.println("Hello, world!"); } } class Application { public static void main(String[] args) throws Exception { DerivedClass instance = new DerivedClass(); ((DerivedClass) instance.clone()).sayHello(); // Displays "Hello, world!" as expected. Invariant #2 is satisfied } }
Repository: squid
![]() ![]() |
||||
Overriding the The following code snippet illustrates this rule: protected void finalize() { // Non-Compliant releaseSomeResources(); } protected void finalize() { super.finalize(); // Non-Compliant releaseSomeResources(); } protected void finalize() { releaseSomeResources(); super.finalize(); // Compliant }
Repository: squid
![]() ![]() |
||||
When the execution is not explicitly terminated at the end of a switch case, it continues to execute the statements of the following case. While this is sometimes intentional, it often is a mistake which leads to unexpected behavior. This rule doesn't apply to empty cases. Indeed those empty cases allow you to specify the same behavior for a group of cases. The following code snippet illustrates this rule: switch (myVariable) { case 0: // Compliant case 1: // Compliant doSomething(); break; case 2: // Compliant return; case 3: // Compliant throw new IllegalStateException(); case 4: // Compliant continue; case 5: // Non-Compliant - both 'doSomething()' and 'doSomethingElse()' will be executed doSomething(); default: // Non-Compliant doSomethingElse(); }
Repository: squid
![]() ![]() |
||||
Switch cases should remain small to keep the overall switch compact and readable. The following code snippet illustrates this rule with the default threshold of 5: switch (myVariable) { case 0: // Compliant - 5 lines till following case System.out.println(""); System.out.println(""); System.out.println(""); break; default: // Non-Compliant - 6 lines till switch end System.out.println(""); System.out.println(""); System.out.println(""); System.out.println(""); break; }
Repository: squid
![]() ![]() |
||||
The requirement for a final default clause is defensive programming. This clause should either take appropriate action or contain a suitable comment as to why no action is taken. The following code snippet illustrates this rule: switch (state) { // Non-Compliant - must have a default case case 0: case 1: System.out.println("0 or 1!"); break; } switch (state) { default: // Non-Compliant - must be last for better readability throw new IllegalStateException(); case 0: case 1: System.out.println("0 or 1!"); break; } switch (state) { case 0: case 1: System.out.println("0 or 1!"); break; default: // Compliant throw new IllegalStateException();
Repository: squid
![]() ![]() |
||||
Early classes of the Java API, such as It is better to use their new unsynchronized replacements:
Noncompliant Code ExampleVector cats = new Vector(); Compliant SolutionArrayList cats = new ArrayList(); ExceptionsUse of those synchronized classes is allowed in method signatures when overriding an existing method. @Override public Vector getCats() {...}
Repository: squid
![]() ![]() |
||||
Calling Noncompliant Code ExampleSystem.exit(0); Runtime.getRuntime().exit(0);
Repository: squid
![]() ![]() |
||||
Two important requirements must be fulfilled when logging messages:
If a program directly writes to the standard output, there is absolutely no way to comply with these requirements. That's why defining and using a dedicated logger is highly recommended. The following code snippet illustrates this rule: System.out.println("My Message"); // Non-Compliant logger.log("My Message"); // Compliant
Repository: squid
![]() ![]() |
||||
According to the Java Language Specification: Unnamed packages are provided by the Java platform principally for convenience when developing small or temporary applications or when just beginning development. To enforce this best practice, classes located in default package can no longer be access from named ones since Java 1.4. The following piece of code: public class MyClass { /* ... */ } should be refactored into: package org.example; public class MyClass{ /* ... */ }
Repository: squid
![]() ![]() |
||||
According to the official Java documentation, The following code snippet illustrates this rule: public void dispose() throws Throwable { this.finalize(); // Non-Compliant }
Repository: squid
![]() ![]() |
||||
This Object.finalize() method is called by the garbage collector on an object when garbage collection determines that there are no more references to the object. But there is absolutely no warranty that this method will be called AS SOON AS the last references to the object are removed. It can be few microseconds to few minutes later. So when some system resources need to be disposed by an object it's better to not rely on this asynchronous mechanism to dispose them. The following piece of code illustrates this rule: public class MyClass { protected void finalize() { releaseSomeResources(); // Non-Compliant } }
Repository: squid
![]() ![]() |
||||
Catching either Only Noncompliant Code Exampletry { /* ... */ } catch (Throwable t) { /* ... */ } try { /* ... */ } catch (Error e) { /* ... */ } Compliant Solutiontry { /* ... */ } catch (Exception e) { /* ... */ } try { /* ... */ } catch (RuntimeException e) { /* ... */ } try { /* ... */ } catch (MyException e) { /* ... */ }
Repository: squid
![]() ![]() |
||||
Loggers should be used instead to print throwables, as they have many advantages:
The following code: try { /* ... */ } catch(Exception e) { e.printStackTrace(); // Non-Compliant } should be refactored into: try { /* ... */ } catch(Exception e) { LOGGER.log("context", e); // Compliant }
Repository: squid
![]() ![]() |
||||
An exception in a
The following code: void foo() throws MyException, MyException {} // Non-Compliant - should be listed once void bar() throws Throwable, Exception {} // Non-Compliant - Exception is a subclass of Throwable void baz() throws RuntimeException {} // Non-Compliant - RuntimeException can always be thrown should be refactored into: void foo() throws MyException {} // Compliant void bar() throws Throwable {} // Compliant void baz() {} // Compliant
Repository: squid
![]() ![]() |
||||
The following code illustrates this rule: void doSomething() { // TODO }
Repository: squid
![]() ![]() |
||||
Nesting The following code: try { try { // Non-Compliant doSomething(); } catch (RuntimeException e) { /* Ignore */ } doSomethingElse(); } catch (Exception e) { /* ... */ } should be refactored into: try { dedicatedMethod(); // Compliant doSomethingElse(); } catch (Exception e) { /* ... */ } /* ... */ private void dedicatedMethod() { try { // Compliant doSomething(); } catch (RuntimeException e) { /* Ignore */ } }
Repository: squid
![]() ![]() |
||||
Sharing some naming conventions is a key point to make it possible for a team to efficiently collaborate. This rule allows to check that all type parameter names match a provided regular expression. The following code snippet illustrates this rule when the regular expression value is "^[A-Z]$": class MyClass<TYPE> { // Non-Compliant <TYPE> void addAll(Collection<TYPE> c) { // Non-compliant } } public class MyClass<T> { // Compliant <T> void addAll(Collection<T> c) { // Compliant } }
Repository: squid
![]() ![]() |
||||
Deprecated
Detects when a local variable is declared and/or assigned, but not used. This rule is deprecated, use squid:S1481 instead.
Repository: pmd
![]() ![]() |
||||
Fields in interfaces are automatically public static final, and methods are public abstract. Classes or interfaces nested in an interface are automatically public and static (all nested interfaces are automatically static). For historical reasons, modifiers which are implied by the context are accepted by the compiler, but are superfluous.
Repository: pmd
![]() ![]() |
||||
Deprecated
Detects when a private field is declared and/or assigned a value, but not used. This rule is deprecated, use squid:S1068 instead.
Repository: pmd
![]() ![]() |
||||
Private methods that are never executed are dead code. Dead code means unnecessary, inoperative code that should be removed. This helps in maintenance by decreasing the maintained code size, making it easier to understand the program and preventing bugs from being introduced. In the following two cases, private methods are not considered as dead code by SonarQube :
Repository: squid
![]() ![]() |