お勉強がてら、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で失敗するようなら、アプリ自体起動できないのでは、とか。
こういうお作法的なものは、どうやって身につけるものか。
誰をどの程度信用するか、とかかねぇ。。。
「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
>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、いいですね。
他にもいっぱいあって、読みきれないですが・・・困ったときに見てみます。