2012-05-01 17 views
3

Androidアプリで緩やかなものを取り除いています。デベロッパーコンソールでnullポインタ例外が見つかりましたが、私の推測ではありませんまれな競争状態。Javaでは、ヌルポインタが起きた場合はほとんどありません。

知らない人のために:Androidでは、ユーザーがクラッシュ(i.E.未キャッチ例外)を開発者に報告することができます。

私は既に悪名高いif (… != null)を入力し始めました:報告書は3つしかありません。だから、まれにしか起こらない。

このような状況では、パフォーマンスは賢明です。代わりにヌルポインタ例外をキャッチする方が良いのでしょうか?

いつもifが評価されることを考慮してください。

答えて

8

狂った人や狭い人のようには聞こえませんが、私は強く信じていますNPEは決して最初の場所に出てはいけません。!私の意見では、NPEの捕獲は非常に悪い習慣です。これは、コードがどのように機能しているかを完全に認識していないことを意味します。

入力を使用する前にまず行うべきことは、nullをチェックすることです。

+0

+1:パフォーマンスに基づいて 'if(x!= null)'を削除する価値はありません。 –

+2

私は 'NPE'だけでなく' RuntimeException'も言っています。 – AlexR

+0

@AlexR:私は完全に同意します。 – Tudor

3

「毎回」の頻度はどのくらいですか? 1回の負荷で1回ですか?毎分? 1000回/秒?

いずれにしても、obj == nullのテストは、おおよそ安価な操作で、例外処理よりも安価です。

そして、ヌルポインタ例外は決して起こらないはずです - それらは理解され、防止される必要があります。なぜそれが起こっているのかわからない場合は、修正する必要があります。

+0

«どのくらいの頻度で "毎回"» - 良い点。実際には頻繁にハットではない。しかし、将来の参照のためのより理論的な質問です。 それ以外は:私はバグを探していましたが、どうすればそれが可能かを知ることはできませんでした。私はVMのバグを考えます。その場合、アプリをクラッシュさせる方が良いかもしれません。 – Martin

2

例外を処理するために例外を使用する必要があります。つまり、値がnullであることが予想される場合は、例外をキャッチするのではなく、値をチェックすることが妥当です。 私はNullPointerExceptionを捕まえることが、通常の制御フローでそれを処理するよりも良い例は考えられません。

+0

ヌルと非ヌルの比率が10'000〜1の場合、十分に例外的ではないでしょうか?それが私が求めているものです。しかし、これはhttp://cstheory.stackexchange.com/の質問かもしれません。 – Martin

+0

配給は無関係です。 –

0

変数が初期化されてから再びnullに設定される可能性がありますか?もしそうなら、 "if(...!= null)"が渡され、それでも例外が出るでしょう。

私はtry catchを使用して安全である(未処理のnullポインタ例外は回避すべきものです)が、競合状態を見つけようとしています。

例外が競合状態をバイパスするように見える場合は、数ミリ秒間待ってから設定し直してください。

0

私はがするが起こったことはありませんし、私の推測それはバグのように聞こえるだけ例外をキャッチまれな競合状態

ある開発者コンソールでnullポインタ例外を見つけましたバグを修正するのではなく、バグを無視するように思えます。これらのヌル値がどこから来ているのかを調べ、ヌルポインタを処理できないコードにヌルポインタを伝播させないでください。

+0

私は大好きです。しかし、私はエラーを再現することはできません。私が持っているのは、カスタマーデバイスからのスタックトレースだけです。そして私は、init(どの2つの関数)の前にリセットが呼び出されるのかを考えると紛失しています。値はinitで一度だけ書き込まれ、他の場所では書き込まれません。 – Martin

関連する問題