私はAndroid/Javaプログラミングの初心者であり、この警告に適切に対処する方法が混乱しています。
メソッド呼び出し ''は、「Java.lang.NullPointerException」を生成する場合があります
警告を削除するにはアサートを使用する必要がありますか?
それとも、ランタイム例外ですか?
任意の助けをいただければ幸いです。
意見の問題であるため、この質問に最終的に答えることはできないと思います。または、少なくとも私はそう信じています-意見も。 :)
「警告なし」(非常に称賛に値する目標)が必要なことは理解していますが、「1つのサイズですべてに適合する」問題はおそらくないでしょう。とはいえ...
あなたがすべきだと思うことしない:
NullPointerException
をスローさせます。これは一般的に悪い考えです。この場合、おそらくオーバーライドonOptionsItemSelected()
であるため、不可能です。通常、(variable != null)
を確認するのが最善の方法です。ただし、それが他のオプションを提示する場合の対処方法。
searchView
がなくてもアプリケーションを続行できます。たとえば、メソッドから戻るだけです。ただし、この状況をlogすることをお勧めします。したがって、テスト中に見つけることができます。RuntimeException
としてチェックされていないため、おそらくアプリがクラッシュすることに注意してください。使い始めました
@SuppressWarnings("ConstantConditions")
idがnullでないと確信している単純なメソッドでは。
個人的には、try {} catch {}を使用するほうがシンプルだからです。ただし、可能性のあるすべてのNULL値をtry catchに入れることを想像すると(コードが互いに隣接していない場合)、コードに大量のデータが追加されます
@matiashが指摘したように、万能のソリューションはありません。
私にとっては、findViewById()
へのすべての呼び出しに対してNullPointerException
警告を無効にし、他のメソッド呼び出しに対してはそれを維持することが妥協策でした。そうすれば、リソースIDを確認する責任がありますが、他の間違いを犯した場合は警告を受け取ることができます。
これを実現するために、Android Studioクイックフィックスメニューに_ -> !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=""_ -> !null"" />
</annotation>
</item>
</root>
更新:残念ながらAndroid Studioの再起動に耐えられない:-(外部アノテーションは本当に便利なので、Androidを作成する方法を見つけてほしい_スタジオは再起動後にそれらをロードします。
はい。検証にif (Object != null){}
を使用するのが適切な方法です。 try {} catch (NullPointerException) {}
は、この場合に推奨される次のソリューションです。
それに乗りたいなら、NullPointerException
を投げてください。この場合、Lintはそれを無視します。 public void myFunc() throws NullPointerException{}
。
とにかく、良いコーディングとは常に、実行中に起こりうる問題についてすべてを検証することを意味します。検証!= null
は問題なく、nullの可能性がある場合は常に使用する必要があります。
私はこれに対する答えが好きです link 。
警告はエラーではありません。そしてあなたが話している警告は「それは生産するかもしれない」と言っていますが、「それは生産しなければならない」と言ってはいけません。だから選択はあなた次第です。 nullチェックを追加するかどうか
したがって、コード内のfindViewByIdがNPEの原因にならないことが確実な場合は、nullチェックを追加しないでください。