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

2011/11/04 10:47

>この前、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するという設計のほうが正しい気もしますが

コメントを投稿

次の HTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

コメントはまだありません。