2013/03/14

[android]どれだけnullチェックする?

お勉強がてら、Androidアプリを作っている。
がてら、というか、お勉強だ。

onCreate()にこんなコードを追加した。

mAdapter = ((NfcManager)this.getSystemService(Context.NFC_SERVICE)).getDefaultAdapter();
mPendingIntent = PendingIntent.getActivity(
				this,
				0,		//request code
				new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
				0);		//flagなし
mFilters = new IntentFilter[] {
				new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)
};
mTechLists = new String[][] {
				new String[] { NfcA.class.getName(), NdefFormatable.class.getName() },
				new String[] { NfcA.class.getName(), Ndef.class.getName() },
				new String[] { NfcF.class.getName(), NdefFormatable.class.getName() },
				new String[] { NfcF.class.getName(), Ndef.class.getName() },
};

さて、このうちどれをnullチェックすべきなのだろうか?

全部やればいいのはいいのだろうけど、実装量が多くなるし、そうなるとバイナリサイズも大きくなるし、動作も遅くなる。
それよりなにより、めんどくさい。

C++だと、例えばgetSystemService()がNULLポインタでないことを確認してからgetDefaultAdapter()を呼ばないと、不正メモリアクセスということでMMUとかから怒られ、try-catchも効かないだろう(getSystemService()が例外を出せばいいんだけど)。
Javaは幸い、nullポインタ参照や0除算とかは例外で扱えるので、try-catchで囲んでおけばいいだろう(nullチェックした方がきれいな気はするがね)。

でも、mFiltersは、IntentFilter[]のnewで失敗するかもしれないし(newの失敗は例外を出すのかな?)、中のIntentFilterのnewで失敗するかもしれない。
例外が出ないのだったら、自分でforでぐるぐるとnullチェックをすることになるだろう。
他のだって、String[]のnewに失敗するかもしれんしね。

 

ただ・・・そこまでせんでもよいのでは、という気がなんとなくしている。
OS積んでるんだから、なんかうまいことやってよ、というお祈りのような気分だ。
この程度のnewで失敗するようなら、アプリ自体起動できないのでは、とか。

こういうお作法的なものは、どうやって身につけるものか。
誰をどの程度信用するか、とかかねぇ。。。

2 件のコメント:

  1. 「nullにはなりようがない」と断言できる状態ならばnullチェックしない。
    というスタンスでやってます。


    > try-catchで囲んでおけばいいだろう
    nullぽや0除算を予測してtyr-catchするのは悪しき習慣となっており、ちゃんとnullチェック、0チェックするのが良い習慣となっております。
    最上はnullや除算に0が入らないようにすることです。

    > mFiltersは、IntentFilter[]のnewで失敗するかもしれない
    配列のnewで失敗はない!(はず)

    > (newの失敗は例外を出すのかな?)
    (失敗の理由によりますが、配列のnewの失敗はRuntimeExceptionとかを返すと思います。chatchしなければ、アプリが落ちると思います。)

    > 中のIntentFilterのnewで失敗するかもしれない。
    可能性はありますが、引数を間違えない限り失敗はないのでnullチェックはしない!

    > この程度のnewで失敗するようなら、アプリ自体起動できないのでは、とか。
    この程度のnewならばたぶん失敗しないので、僕ならnullチェックせずそのまま突っ込みます。

    1人のJavaエンジニアの考えとして、ご参考にして頂けると嬉しいです。

    【参考】
    EXP01-J. null ポインタ参照しない http://www.jpcert.or.jp/java-rules/exp01-j.html

    ERR08-J. NullPointerException およびその親クラスの例外をキャッチしない http://www.jpcert.or.jp/java-rules/err08-j.html

    返信削除
    返信
    1. >nullぽや0除算を予測してtyr-catchするのは悪しき習慣となっており
      なるほど。予測できるものは最初からやっておくのは、この世界?も同じなのですね。

      >配列のnewで失敗はない!(はず)
      そうなんですか・・・。
      IBMのページにも、newのnullチェックはしないと書いてました。
      http://www.ibm.com/developerworks/jp/java/library/j-jw-javatip88/#f

      newでnullを返すのが禁止なら、
      >> 中のIntentFilterのnewで失敗するかもしれない。
      というのも、意味が無いってことですね。


      >1人のJavaエンジニアの考えとして、ご参考にして頂けると嬉しいです。
      ありがとうございます。
      つくってるものによって変わってくることもあると思うので、参考にさせていただきます。


      参考URL、いいですね。
      他にもいっぱいあって、読みきれないですが・・・困ったときに見てみます。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。