2011年11月4日金曜日

Javaの数値チェックでNumberFormatExceptionを使ってはいけない理由

この前、Javaの半角数値チェックでぐぐっていたらわりと下記みたいな
ソースコードを見つけました

private static boolean isNumeric(String hoge) {
 try {
  Integer.parseInt(hoge);
  return true;
 } catch(NumberFormatException e) {
   return false;
 }
}

これは動きとしては正しい結果をだしますが
好ましくありません。
下記のような書き方のほうが好ましいです


private static boolean isNumeric(String hoge){
 char c = null;
 for (int i = 0 ; i < hoge.length(); i++){
  c = hoge.charAt(i);
  if (c < '0' || c > '9'){
    return false;
  }
 }
 return true;
}


理由1
Javaはガベージコレクションのおかげでスマートなメモリ管理を
可能ですが、例外もあります。それは名の通り"例外"の時です。

Exceptionがthrowされると一時的でもヒープを大幅に使うので
やはりexceptionはなるべく避けるように使うべきです。

これが何十万件のデータを処理するバッチならば当然避けるべきです

理由2
上記とかぶりますがExceptionはその名の通り、「例外」ですので
プログラマの想定しなかったケースのみ発生するようなあり方が
好ましいためです。チェックのために使うというのはプログラム設計
としてよろしくないためです(※理由2は個人的見解です)



余談
たとえばほとんど数値以外の文字が入ってくること無いが
想定される場合はNumberFormatExceptionを使うケースでもよいかもしれません

ただその場合NumberFormatExceptionをthrowする、あるいはラッピングされた
なんからのExceptionをthrowするという設計のほうが正しい気もしますが

0 件のコメント:

コメントを投稿