Empty Code
Empty Code 룰셋에는 모든 종류의 빈 코드(코드 없는 메소드, 빈 블록, 빈 try-catch 블록, …)에 대한 룰이 포함되어있습니다.
1. EmptyCatchBlock
빈 catch 블록은 예외가 잡히지만 아무것도 수행되지 않는 인스턴스를 찾습니다.
대부분의 경우 행동을 취했다고 보고합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public void doSomething() {
try {
FileInputStream fis = new FileInputStream("/tmp/bugger");
} catch (IOException ioe) {
// 좋지 않음
}
}
2. EmptyIfStmt
빈 if 문은 조건이 검사된 인스턴스를 찾지만 아무것도 수행하지 않습니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
void bar(int x) {
if (x == 0) {
// 비어있음
}
}
}
3. EmptyWhileStmt
비어있는 while 문은 모든 인스턴스를 찾지만 아무것도 수행하지 않습니다.
Timing 루프인 경우 Thread.sleep()을 사용해야 합니다; exit 표현식에서 많은일을 하는 while 문은 명확하게 하기 위해서 다시 작성합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
void bar(int a, int b) {
while (a == b) {
// 비어있음
}
}
4. EmptyTryBlock
빈 try 블록은 사용하지 않습니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
public void bar() {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. EmptyFinallyBlock
빈 finally 블록은 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
public void bar() {
try {
int x=2;
} finally {
// 비어있음
}
}
}
6. EmptySwitchStatements
비어있는 switch 문은 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public void bar() {
int x = 2;
switch (x) {
// 코드가 있더라도 주석처리 되어 있으면 규칙 실행
}
}
7. EmptySynchronizedBlock
비어있는 synchronized 문은 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
public void bar() {
synchronized (this) {
// 비어있음
}
}
}
8. EmptyStatementNotInLoop
'for’문의 사용되지 않는 비어있는 본문 (또는 세미콜론 자체) 또는 'while' 반복문은 아마 버그일 것입니다.
또한 목적이 없는 중복 세미콜론일 수도 있어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public void doit() {
// 의미 없는 코드
;
// 추가적인 세미콜론은 불필요
System.out.println("look at the extra semicolon");;
}
9. EmptyInitializer
비어있는 이니셜라이저는 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
static {} // 불필요
{} // 불필요
}
10. EmptyStatementBlock
비어있는 블록문은 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
private int _bar;
public void setBar(int bar) {
{ _bar = bar; } // 왜 안 되나요?
{} // 불필요
}
}
11. EmptyStaticInitializer
비어있는 static 이니셜라이저는 용도가 없어 삭제해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
static {
// 비어있음
}
}
12. PositionLiteralsFirstInComparisons
단순 문자열 비교와 String 객체를 비교할 경우 문자열을 앞에 두고 사용합니다.
String 객체가 앞에 있을 때 이 객체가 null이면 NullPointerException을 발생시키지만, 문자열이 앞에 있다면 단순히 false만 반환합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
class Foo {
boolean bar(String x) {
return x.equals("2"); // "2".equals(x) 이어야 합니다
}
}
13. MisplacedNullCheck
여기서 null check 는 잘못된 방법입니다; 변수가 null일 경우 NullPointException이 thrown 됩니다.
Check가 쓸모 없거나(변수가 null일 수 없음) 또는 부적절합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class Foo {
void bar() {
if (a.equals(baz) && a != null) {}
}
}
public class Foo {
void bar() {
if (a.equals(baz) || a == null) {}
}
}
14. BrokenNullCheck
|| 대신에 &&를 사용하거나 반대로 && 대신에 ||을 사용하여 잘못된 null 체크를 할 경우 NullPointerException이 발생합니다.
1 .우선순위: Medium High
2 .심각도: 에러
3 .예시
public String bar(String string) {
// && 이어야 합니다
if (string!=null || !string.equals(""))
return string;
// || 이어야 합니다
if (string==null && string.equals(""))
return string;
}
15. JumbledIncrementer
무질서한 루프 증가문은 피해야합니다. 대부분 실수로 작성했고 의도적이라고 할지라도 혼란스럽게 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
public class JumbledIncrementerRule1 {
public void foo() {
for (int i = 0; i < 10; i++) { // 'i'만 참조
for (int k = 0; k < 20; i++) { // 'i' 그리고 'k' 둘 다 참조
System.out.println("Hello");
}
}
}
}
16. CompareObjectsWithEquals
객체의 비교는 ==이 아닌 equals()를 이용하여 비교합니다.
1 .우선순위: Medium High
2 .심각도: 에러
3 .예시
class Foo {
boolean bar(String a, String b) {
return a == b;
}
}
17. BadComparison
변수를 Double.NaN과 비교하는 것은 로직 오류를 발생시키는 경향이 있으므로 피해야 합니다.
1 .우선순위: Medium
2 .심각도: 경고
3 .예시
boolean x = (y == Double.NaN);
18. EqualsNull
경험이 부족한 프로그래머들은 비교에 대한 개념이 부족해서 equals()를 이용해서 null을 비교하는 경우가 있습니다.
==은 객체 참조(object reference)를 직접 비교하지만 equals()는 객체 내에 정의된 방식에 따라 비교합니다. 만약 equals()를 실행하는 객체가 null일 경우 NullPointerException을 발생시킵니다.
1 .우선순위: High
2 .심각도: 에러
3 .예시
String x = "foo";
if (x.equals(null)) { // 좋지 않은 형태
doSomething();
}
if (x == null) { // 권장
doSomething();
}