web-dev-qa-db-ja.com

適切な処理方法Android StudioのNullPointerException lint警告

私はAndroid/Javaプログラミングの初心者であり、この警告に適切に対処する方法が混乱しています。

メソッド呼び出し ''は、「Java.lang.NullPointerException」を生成する場合があります

enter image description here

警告を削除するにはアサートを使用する必要がありますか? enter image description here

それとも、ランタイム例外ですか? enter image description here

任意の助けをいただければ幸いです。

33
Hackmodford

意見の問題であるため、この質問に最終的に答えることはできないと思います。または、少なくとも私はそう信じています-意見も。 :)

「警告なし」(非常に称賛に値する目標)が必要なことは理解していますが、「1つのサイズですべてに適合する」問題はおそらくないでしょう。とはいえ...

あなたがすべきだと思うことしない

  • assertを使用します。 assertステートメントを追加できますが、Dalvikはそれらを無視します。必要に応じてエミュレータを設定できますが、実際のデバイスは使用できません( assert on Android devices? を参照)。警告を削除すると、実際には役に立ちません。
  • メソッドにNullPointerExceptionをスローさせます。これは一般的に悪い考えです。この場合、おそらくオーバーライドonOptionsItemSelected()であるため、不可能です。

通常、(variable != null)を確認するのが最善の方法です。ただし、それが他のオプションを提示する場合の対処方法。

  • 問題がある場合はrecoverから、つまりsearchViewがなくてもアプリケーションを続行できます。たとえば、メソッドから戻るだけです。ただし、この状況をlogすることをお勧めします。したがって、テスト中に見つけることができます。
  • それ以外の場合、続行できない場合は、例外をスローします。問題を簡単に検出できるように、 早期失敗 にする必要があります。この場合の妥当な例外は、IllegalStateExceptionです( 。NET System.InvalidOperationExceptionと同等のJava を参照)。基本的に、このメソッドが不適切な時間に実行されたことを示しています。ただし、これらの例外はRuntimeExceptionとしてチェックされていないため、おそらくアプリがクラッシュすることに注意してください。
28
matiash

使い始めました

@SuppressWarnings("ConstantConditions")

idがnullでないと確信している単純なメソッドでは。

25
Herrbert74

個人的には、try {} catch {}を使用するほうがシンプルだからです。ただし、可能性のあるすべてのNULL値をtry catchに入れることを想像すると(コードが互いに隣接していない場合)、コードに大量のデータが追加されます

1
Georgi Angelov

@matiashが指摘したように、万能のソリューションはありません。

私にとっては、findViewById()へのすべての呼び出しに対してNullPointerException警告を無効にし、他のメソッド呼び出しに対してはそれを維持することが妥協策でした。そうすれば、リソースIDを確認する責任がありますが、他の間違いを犯した場合は警告を受け取ることができます。

これを実現するために、Android St​​udioクイックフィックスメニューに_ -> !nullメソッドコントラクトを追加しました。

このアクションにより、プロジェクトルートのAndroid/support/v7/app/annotations.xmlに次のファイルファイルが生成されました。

<root>
  <item name='Android.support.v7.app.AppCompatActivity Android.view.View findViewById(int)'>
    <annotation name='org.jetbrains.annotations.Contract'>
      <val val="&quot;_ -&gt; !null&quot;" />
    </annotation>
  </item>
</root>

更新:残念ながらAndroid St​​udioの再起動に耐えられない:-(外部アノテーションは本当に便利なので、Androidを作成する方法を見つけてほしい_スタジオは再起動後にそれらをロードします。

1
Iwo Banas

はい。検証にif (Object != null){}を使用するのが適切な方法です。 try {} catch (NullPointerException) {}は、この場合に推奨される次のソリューションです。

それに乗りたいなら、NullPointerExceptionを投げてください。この場合、Lintはそれを無視します。 public void myFunc() throws NullPointerException{}

とにかく、良いコーディングとは常に、実行中に起こりうる問題についてすべてを検証することを意味します。検証!= nullは問題なく、nullの可能性がある場合は常に使用する必要があります。

1
Emanuel S

私はこれに対する答えが好きです link

警告はエラーではありません。そしてあなたが話している警告は「それは生産するかもしれない」と言っていますが、「それは生産しなければならない」と言ってはいけません。だから選択はあなた次第です。 nullチェックを追加するかどうか

したがって、コード内のfindViewByIdがNPEの原因にならないことが確実な場合は、nullチェックを追加しないでください。

0
Ryan