Sponsored link
PMD Strict Exception ルール
Exceptionに関して厳しいルール
チームでコーディングするのなら採用した方がいいでしょう。
自分の常識と他人の常識は違いますから。
個人でコーディングするなら一度この習慣を見につければそう破ることはないし破るときは手を抜きたいときなので
採用しなくてもいいでしょう。
AvoidCatchingThrowable(Throwableをcatchしてはいけない)
Exceptionの親クラスである、
ThrowableをすべてCatchしてしまうと
OutOfMemoryErrorのようなThrowableを継承したErrorクラスもCatchしてしまうので
よくありません。ErrorクラスをCatchしたいならそう記述すべきです。
//よくない例
try {
sdf = new SimpleDateFormat("yyyy-MM-dd");
} catch (Throwable th) { //Should not catch throwable
th.printStackTrace();
}
//大丈夫な例
try {
sdf = new SimpleDateFormat("yyyy-MM-dd");
} catch (Exception th) { //Should not catch throwable
th.printStackTrace();
}
SignatureDeclareThrowsException(どういうExceptionを投げるのははっきりすべき)
手を抜いて、throws Exception とすると、そのクラスを使う人は、どういう事態が起きるのか理解できません。
それにこれをcatchしようとすると、ExceptionTypeCheckingのようなコードになるのでこういう書き方をしてはいけません。
tryでException全部拾ってもドキュメントには出ませんのでそれほど問題ではありません。(もちろんExceptionをcacthするのは手抜きコード以外の何者でもありません)
//よくない例
public void methodThrowingException() throws Exception {
}
//大丈夫な例
public void methodThrowingException() throws IOException,InterruptedException {
}
ExceptionTypeChecking(Exceptionは個別に拾うべきだ)
//よくない例
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
try {
returnString = sdf.format(value);
} catch (Exception ex) {
/* BAD STUFF !!!*/
if (ex instanceof NumberFormatException) {
System.out.println("NumberFormat exception!!!");
}
if (ex instanceof IllegalArgumentException) {
System.out.println("illegal argument...!!!");
}
}
//大丈夫な例
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
try {
returnString = sdf.format(value);
} catch (NumberFormatException ex) {
System.out.println("NumberFormat exception!!!");
}
catch(IllegalArgumentException ex2) {
System.out.println("illegal argument...!!!");
}
